Hello I have made a code for serial conversion of a tga picture from rgb to colour and blackwhite
I would like to ask what to do to make this with threads and openmp
Just some hints offcourse not the code
Here is the code
Thanks in advance!
I would like to ask what to do to make this with threads and openmp
Just some hints offcourse not the code
Here is the code
Thanks in advance!
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "tga_library.h" void Display_Header (TGA_HEADER header){ printf("ID length: %d\n",header.idlength); printf("Colourmap type: %d\n",header.colourmaptype); printf("Image type: %d\n",header.datatypecode); printf("Colour map offset: %d\n",header.colourmaporigin); printf("Colour map length: %d\n",header.colourmaplength); printf("Colour map depth: %d\n",header.colourmapdepth); printf("X origin: %d\n",header.x_origin); printf("Y origin: %d\n",header.y_origin); printf("Width: %d\n",header.width); printf("Height: %d\n",header.height); printf("Bits per pixel: %d\n",header.bitsperpixel); printf("Descriptor: %d\n",header.imagedescriptor); } TGA_HEADER Get_Header (FILE *fptr){ TGA_HEADER header; /* Retrieve the header fields */ header.idlength = fgetc(fptr); header.colourmaptype = fgetc(fptr); header.datatypecode = fgetc(fptr); fread(&header.colourmaporigin,2,1,fptr); fread(&header.colourmaplength,2,1,fptr); header.colourmapdepth = fgetc(fptr); fread(&header.x_origin,2,1,fptr); fread(&header.y_origin,2,1,fptr); fread(&header.width,2,1,fptr); fread(&header.height,2,1,fptr); header.bitsperpixel = fgetc(fptr); header.imagedescriptor = fgetc(fptr); return header; } void Set_Header (FILE *fptr, TGA_HEADER header){ putc(header.idlength, fptr); //header.idlength = fgetc(fptr); putc(header.colourmaptype, fptr); //header.colourmaptype = fgetc(fptr); putc(header.datatypecode, fptr); //header.datatypecode = fgetc(fptr); putc((header.colourmaporigin & 0x00FF), fptr); putc((header.colourmaporigin & 0xFF00)/256, fptr); //fread(&header.colourmaporigin,2,1,fptr); putc((header.colourmaplength & 0x00FF), fptr); putc((header.colourmaplength & 0xFF00)/256, fptr); //fread(&header.colourmaplength,2,1,fptr); putc(header.colourmapdepth, fptr); //header.colourmapdepth = fgetc(fptr); putc((header.x_origin & 0x00FF), fptr); putc((header.x_origin & 0xFF00)/256, fptr); //fread(&header.x_origin,2,1,fptr); putc((header.y_origin & 0x00FF), fptr); putc((header.y_origin & 0xFF00)/256, fptr); //fread(&header.y_origin,2,1,fptr); putc((header.width & 0x00FF), fptr); putc((header.width & 0xFF00)/256, fptr); //fread(&header.width,2,1,fptr); putc((header.height & 0x00FF), fptr); putc((header.height & 0xFF00)/256, fptr); //fread(&header.height,2,1,fptr); putc(header.bitsperpixel, fptr); //header.bitsperpixel = fgetc(fptr); putc(header.imagedescriptor, fptr); //header.imagedescriptor = fgetc(fptr); } PIXEL Get_Pixel(int x, int y, FILE* fptr, TGA_HEADER header) { int offset; PIXEL pixel; offset = 18*sizeof(char); offset += y*header.width*3*sizeof(char); offset += x*3*sizeof(char); fseek(fptr, offset, SEEK_SET); pixel.b = fgetc(fptr); pixel.g = fgetc(fptr); pixel.r = fgetc(fptr); return pixel; } void Set_Pixel(int x, int y, PIXEL pixel, FILE* fptr, TGA_HEADER header) { int offset; offset = 18*sizeof(char); offset += y*header.width*3*sizeof(char); offset += x*3*sizeof(char); fseek(fptr, offset, SEEK_SET); putc(pixel.b, fptr); putc(pixel.g, fptr); putc(pixel.r, fptr); } unsigned char Get_Grey_Pixel(int x, int y, FILE* fptr, TGA_HEADER header) { int offset; unsigned char pixel; offset = 18*sizeof(char); offset += y*header.width*sizeof(char); offset += x*sizeof(char); fseek(fptr, offset, SEEK_SET); pixel = fgetc(fptr); return pixel; } void Set_Grey_Pixel(int x, int y, unsigned char pixel, FILE* fptr, TGA_HEADER header) { int offset; offset = 18*sizeof(char); offset += y*header.width*sizeof(char); offset += x*sizeof(char); fseek(fptr, offset, SEEK_SET); putc(pixel, fptr); }
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "tga_library.h" void main (int argc, char *argv[]){ TGA_HEADER header; PIXEL pixel; unsigned char oldpixel, newpixel, temppixel; int quant_error; int x,y, name_length; FILE *fptr, *gs_fptr, *bw_fptr; char gs_fileName[100], bw_fileName[100]; unsigned char grey_pixel; TGA_HEADER gs_header, bw_header; if (argc < 2) { fprintf(stderr,"Usage: %s tgafile\n",argv[0]); exit(-1); } /* Open the original file */ if ((fptr = fopen(argv[1],"r")) == NULL) { fprintf(stderr,"File open failed\n"); exit(-1); } // Create name of gray-scale image name_length = strlen(argv[1]); argv[1][name_length-4]='\0'; sprintf(gs_fileName, "%s-grey.tga", argv[1]); // Open grey-scale image file if ((gs_fptr = fopen(gs_fileName,"w")) == NULL) { fprintf(stderr,"File open failed\n"); exit(-1); } // Create name of b&w image (dithered) sprintf(bw_fileName, "%s-bw.tga", argv[1]); // Open blackwhite image file if ((bw_fptr = fopen(bw_fileName,"w+")) == NULL) { fprintf(stderr,"File open failed\n"); exit(-1); } // Get header of original file header = Get_Header(fptr); // Create header for grey-scale image gs_header = header; gs_header.datatypecode = 3; gs_header.bitsperpixel = 8; // Write grey-scale header to grey-scale file Set_Header(gs_fptr, gs_header); // Create header for b&w image bw_header = header; bw_header.datatypecode = 3; bw_header.bitsperpixel = 8; // Write b&w header to b&w file Set_Header(bw_fptr, bw_header); // Create grey-scale image for(y=0; y<header.height; y++) { for (x=0; x<header.width; x++) { //Gray = 0.299 * Red + 0.587 * Green + 0.114 * Blue pixel = Get_Pixel(x, y, fptr, header); grey_pixel = 0.299 * pixel.r + 0.587 * pixel.g + 0.114 * pixel.b; //printf("%d/%d\n", y*header.width+x, header.width*header.height); // printf("%d\n",grey_pixel); Set_Grey_Pixel(x, y, grey_pixel, gs_fptr, gs_header); Set_Grey_Pixel(x, y, grey_pixel, bw_fptr, bw_header); } } // Create black-white image for (y=0;y<header.height;y++) { for(x=0;x<header.width;x++) { oldpixel = Get_Grey_Pixel(x, y, bw_fptr, bw_header); if ( oldpixel < 128 ){ newpixel = 0; } else{ newpixel = 255; } Set_Grey_Pixel(x, y, newpixel, bw_fptr, bw_header); quant_error = oldpixel - newpixel; printf("%d - %d = %d\n",oldpixel, newpixel, quant_error); //printf("%d\n",oldpixel); if(x<header.width){ temppixel = Get_Grey_Pixel(x+1, y, bw_fptr, bw_header); temppixel = temppixel + 7/16*quant_error; Set_Grey_Pixel(x+1, y, temppixel, bw_fptr, bw_header); } if(y<header.height){ temppixel = Get_Grey_Pixel(x-1, y+1, bw_fptr, bw_header); temppixel = temppixel + 3/16*quant_error; Set_Grey_Pixel(x-1, y+1, temppixel, bw_fptr, bw_header); } if(y<header.height){ temppixel = Get_Grey_Pixel(x, y+1, bw_fptr, bw_header); temppixel = temppixel + 5/16*quant_error; Set_Grey_Pixel(x, y+1, temppixel, bw_fptr, bw_header); } if((x+1<header.width)&&(y+1<header.height)){ temppixel = Get_Grey_Pixel(x+1, y+1, bw_fptr, bw_header); temppixel = temppixel + 1/16*quant_error; Set_Grey_Pixel(x+1, y+1, temppixel, bw_fptr, bw_header); } } } fclose(fptr); fclose(gs_fptr); fclose(bw_fptr); }
typedef struct { char idlength; char colourmaptype; char datatypecode; short int colourmaporigin; short int colourmaplength; char colourmapdepth; short int x_origin; short int y_origin; short width; short height; char bitsperpixel; char imagedescriptor; } TGA_HEADER; typedef struct { unsigned char r,g,b; } PIXEL; void Display_Header (TGA_HEADER header); void Set_Header (FILE *fptr, TGA_HEADER header); TGA_HEADER Get_Header (FILE *fptr); PIXEL Get_Pixel(int x, int y, FILE* fptr, TGA_HEADER header); void Set_Pixel(int x, int y, PIXEL pixel, FILE* fptr, TGA_HEADER header); unsigned char Get_Grey_Pixel(int x, int y, FILE* fptr, TGA_HEADER header); void Set_Grey_Pixel(int x, int y, unsigned char pixel, FILE* fptr, TGA_HEADER header);