From: Reka S. <rek...@gm...> - 2016-11-02 11:56:38
|
Hi All, I am very new for libjpeg and mailing list also. I am trying to decompress jpg image using following code. Input parameters are image name, width and height. return type is custom structure called IMG_MATRIX. typedef struct img_matrix{ int x; int y; int intensity_r; int intensity_g; int intensity_b; } IMG_MATRIX; I need to get pixel values (R,G,B) and create new jpeg image. Issue is i got blurred image when I try generate new new jpeg image. (see attachments) I think issue is having my decompress code. because I can generate correct image if I read image using OpenCv. If anyone can help to solve this issue It would be grate. Best Regards, *my code of read jpeg as follows. * IMG_MATRIX *katussa_read_jpeg(char *watermarked_image_name, int width, int height) { // Using this uninitialized pointer later to store raw, uncompressd image unsigned char *raw_image = NULL; char *filename = watermarked_image_name; // Dimensions of the image we want to write //int width = 512; //int height = 512; int bytes_per_pixel = 3; /* or 1 for GRACYSCALE images */ int color_space = JCS_RGB; /* or JCS_GRAYSCALE for grayscale images */ int index = width*height*41; IMG_MATRIX *img_matrix = NULL; img_matrix = (IMG_MATRIX*) malloc(index); // variables for cordinates of img_matrix int x, y; int total_pixel = width*height; // These are standard libjpeg structures for reading(decompression) struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; // libjpeg data structure for storing one row, that is, scanline of an image JSAMPROW row_pointer[1]; FILE *infile = fopen( filename, "rb" ); unsigned long *location; int i = 0; if ( !infile ) { printf("Error opening jpeg file %s\n!", filename ); exit; } // Here we set up the standard libjpeg error handler cinfo.err = jpeg_std_error( &jerr ); // Setup decompression process and source, then read JPEG header jpeg_create_decompress( &cinfo ); // This makes the library read from infile jpeg_stdio_src( &cinfo, infile ); // Reading the image header which contains image information jpeg_read_header( &cinfo, TRUE ); // Start decompression jpeg here jpeg_start_decompress( &cinfo ); // Allocate memory to hold the uncompressed image raw_image = (unsigned char*)malloc( cinfo.output_width*cinfo.output_height*cinfo.num_components ); // Now actually read the jpeg into the raw buffer row_pointer[0] = (unsigned char *)malloc( cinfo.output_width*cinfo.num_components ); location = (unsigned long*)malloc( cinfo.output_width*cinfo.output_height*cinfo.num_components ); // Read one scan line at a time long long int pixel_index = -1; y = 0; unsigned long count = 0; while( cinfo.output_scanline < cinfo.image_height ) { jpeg_read_scanlines( &cinfo, row_pointer, 1 ); x = 0; for( i=0; i<cinfo.image_width*cinfo.num_components; i++){ location[count] = row_pointer[0][i]; if((count%3)==0) { pixel_index++; img_matrix[pixel_index].x = x; img_matrix[pixel_index].y = y; img_matrix[pixel_index].intensity_r = row_pointer[0][i]; x++; } if((count%3)==1) { img_matrix[pixel_index].intensity_g = row_pointer[0][i]; } if((count%3)==2) { img_matrix[pixel_index].intensity_b = row_pointer[0][i]; } count++; } y++; //break; } // Wrap up decompression, destroy objects, free pointers and close open files jpeg_finish_decompress( &cinfo ); jpeg_destroy_decompress( &cinfo ); free( row_pointer[0] ); fclose( infile ); return img_matrix; } -- Reka Sandaruwan Senior Engineer WSO2 |