Hi,
I'm currently working on some code that will need to read color tiff image files. While I have no problems working with gray scale images I have not had any luck getting color to work. At the moment all I am simply trying to do is read a color tiff image (which filename is "input.tif") and output the values of individual samples (pixel elements RGB) to the screen. (I'm intentionally not printing all image pixels to the screen at the moment.) However, what my code currently does is output partially correct results. It seems to display the first few (~10) samples fine to the screen, but then starts skipping samples. Do you guys have any ideas what may be causing that? What may be wrong with my code (listed below)?
Any suggestions/pointers would be greatly appreciated.
Thank you.
This is my code (hopefully it doesn't lose all formatting):
Code:#include <stdio.h> #include <iostream.h> #include <tiffio.h> void print_error (char *err_message); int main() { double red_mean; // mean red value of fed image uint32 r; // row index uint32 c; // column index uint32 rows; // number of rows in image uint32 columns; // number of columns in image uint16 BitsPerSample; // normally 8 for grayscale image uint16 SamplesPerPixel; // normally 1 for grayscale image uint16 PhotoMetric; // normally 1 for grayscale image unsigned char *in_image; // pointer for input image array unsigned char *out_image; // pointer for output image array TIFF *in_filep; // handle for input image file TIFF *out_filep; // handle for output image file int check_io; // status of I/O operation // Open input image file in_filep = TIFFOpen("input.tif", "r"); if (in_filep == NULL) print_error ("Could not open input file!"); // Open output image file out_filep = TIFFOpen ("output.tif", "w"); if (out_filep == NULL) print_error ("Could not open output file!"); // Determine the size of the input image TIFFGetField(in_filep, TIFFTAG_IMAGELENGTH, &rows); TIFFGetField(in_filep, TIFFTAG_IMAGEWIDTH, &columns); TIFFGetField(in_filep, TIFFTAG_BITSPERSAMPLE, &BitsPerSample); TIFFGetField(in_filep, TIFFTAG_SAMPLESPERPIXEL, &SamplesPerPixel); TIFFGetField(in_filep, TIFFTAG_PHOTOMETRIC, &PhotoMetric); //TIFFGetField(in_filep, TIFFTAG_PHOTOMETRIC, &PlanarConfig); // The following statements are helpful in debugging printf ("rows = %ld\n", rows); printf ("columns = %ld\n", columns); printf ("BitsPerSample = %d\n", BitsPerSample); printf ("SamplesPerPixel = %d\n", SamplesPerPixel); printf ("PhotoMetric = %d\n", PhotoMetric); // Specify TIFF header fields for output image TIFFSetField(out_filep, TIFFTAG_IMAGELENGTH, rows); TIFFSetField(out_filep, TIFFTAG_IMAGEWIDTH, columns); TIFFSetField(out_filep, TIFFTAG_BITSPERSAMPLE, BitsPerSample); TIFFSetField(out_filep, TIFFTAG_SAMPLESPERPIXEL, SamplesPerPixel); TIFFSetField(out_filep, TIFFTAG_PLANARCONFIG, 1); TIFFSetField(out_filep, TIFFTAG_PHOTOMETRIC, PhotoMetric); // Allocate memory to hold image arrays in_image = (unsigned char *) _TIFFmalloc(rows*columns); if (in_image == NULL) print_error ("Could not allocate memory!"); out_image = (unsigned char *) _TIFFmalloc(rows*columns); if (out_image == NULL) print_error ("Could not allocate memory!"); // Read image pixel values from file, row by row for (r = 0; r < rows; r++) { check_io = TIFFReadScanline(in_filep, &in_image[r*columns], r, 1); if (check_io != 1) print_error ("Could not read image from file!"); } //************************************************************************************ // Output the first several samples (pixel elements) to screen red_mean = 0; for (r = 0; r < 3; r++) for (c = 0; c < 24; c++) //for (c = 0; c <= (columns*3); (c=c+3)) { cout << "r = " << r << " c= " << c << " Intensity = " << (int) in_image[r*columns+c] << endl; } //************************************************************************************ // Write new image to file, row by row for (r = 0; r < rows; r++) { check_io = TIFFWriteScanline(out_filep, &out_image[r*columns], r, 1); if (check_io != 1) print_error ("Could not read image from file!"); } // Deallocate the image memory, close file streams, and exit _TIFFfree(in_image); _TIFFfree(out_image); TIFFClose(in_filep); TIFFClose(out_filep); exit (0); } /***************************************************** Function name: print_error Description: Print an error message, and exit the program. Input parameters: err_message -- pointer to string to be printed Returned value: none *****************************************************/ void print_error (char *err_message) { fprintf(stderr, "Error: %s\n", err_message); exit (1); }



LinkBack URL
About LinkBacks




) So, at this point all I am trying to do is read in the image and output the first several RGB samples. Not sure what I'm doing wrong, whether it has someting to do with the headers or not?
However, this is not what the output shows. (Peculiarities such as that seem to happen in every row.)