2004.11.22 06:32 "[Tiff] Unexpected TIFF output", by Zac Bond

2004.11.22 06:32 "[Tiff] Unexpected TIFF output", by Zac Bond

I am attempting to write a program that extracts text from an old document based on the color of the ink. I am having a lot of trouble figuring out how to use libTIFF to write my image to a file. Here are the results:

Original: http://home.cwru.edu/~zwb2/smallblock.tif
Result: http://home.cwru.edu/~zwb2/binresult.tif

As you can see, the second image looks like a squashed version of part of the original, with odd vetical lines. I don't understand how this is happening; the contents of my image buffer are correct. Also, I notice that the output has only values of 255 and 0, whereas my buffer used 250 and 10. Huh?

Here is my code. I'm guesing I am using TIFFWriteScanline wrong, or else perhaps I forgot to set an important tag? (I deleted the errorchecking for this post, but there were no errors when run)

int main(int argc, char* argv[])
{
        // Open file
        TIFF* infile = TIFFOpen(argv[1], "r");

        // Read in tags
        uint32 rows, columns;
        size_t imagesize;
        int errorval;

        TIFFGetField(infile, TIFFTAG_IMAGELENGTH, &rows);
        TIFFGetField(infile, TIFFTAG_IMAGEWIDTH, &columns);

        // Now we read in the color image using RGBA
        imagesize = rows * columns;
        uint32* raster = (uint32*) _TIFFmalloc(imagesize * sizeof(uint32));
        TIFFReadRGBAImageOriented(infile, columns, rows,                                                                        raster, ORIENTATION_TOPLEFT, 1);

        // Now create an output file & set fields for an 8-bit grayscale image
        TIFF* outfile = TIFFOpen("binresult.tif", "w");
        TIFFSetField(outfile, TIFFTAG_IMAGELENGTH, rows);
        TIFFSetField(outfile, TIFFTAG_IMAGEWIDTH, columns);
        TIFFSetField(outfile, TIFFTAG_BITSPERSAMPLE, 8);
        TIFFSetField(outfile, TIFFTAG_COMPRESSION, 1);
        TIFFSetField(outfile, TIFFTAG_FILLORDER, 1);
        TIFFSetField(outfile, TIFFTAG_ORIENTATION, 1);
        TIFFSetField(outfile, TIFFTAG_PHOTOMETRIC, 1);
        TIFFSetField(outfile, TIFFTAG_PLANARCONFIG, 1);
        TIFFSetField(outfile, TIFFTAG_SAMPLESPERPIXEL, 1);

        // Allocate memory the new image
        uint32* binimage = (uint32*) _TIFFmalloc(imagesize * sizeof(uint32));

        for (int r = 0; r < rows; r++)
                for (int c = 0; c < columns; c++)
                {
                        // Various logic to threshold the image
                        // based on pixel color goes on in here
                        if (fill_loc)
                                binimage[r * columns + c] = 10;
                        else
                                binimage[r * columns + c] = 250;
                }

        // Write the new file
        for (int r = 0; r < rows; r++)
          TIFFWriteScanline(outfile, &binimage[r * columns], r);

        // Clean up memory, etc.
}

Thanks to anyone who can help me out. I'm a bit new to this, and I'm sure I'm missing something simple.

-Zac Bod