
Thread
2011.01.25 01:02 "Re: [Tiff] Cannot read YCbCr JPEG-compressed images", by Craig Bruce
Using TIFFReadEncodedTile, I was able to decode all 7 images in the sample file without any errors.
I put together the following test program:
#include <stdio.h>
#include <stdlib.h>
#include <tiffio.h>
main()
{
TIFF *tiff;
ttile_t tileNum;
tsize_t tileSize;
int readSize;
tdata_t buf;
tiff = TIFFOpen( "Q09050_006_NIR.tif", "r" );
if (tiff == NULL) goto ERROR;
tileNum = TIFFComputeTile( tiff, 0, 0, 0, 0 );
tileSize = TIFFTileSize( tiff );
buf = malloc( tileSize );
printf( "tileNum=%ld, tileSize=%ld, buf=%p\n", (long) tileNum,
(long) tileSize, (long) buf );
readSize = TIFFReadEncodedTile( tiff, tileNum, buf, tileSize );
if (readSize == -1) goto ERROR;
printf("successful read, size=%d\n", readSize );
exit( 0 );
ERROR:
printf( "ERROR!\n" );
exit( 1 );
}
If I build it using the system libraries on my computer (Linux x86_64, Fedora 13, libtiff 3.9.4), it works:
$ gcc tile.c -ltiff -ljpeg -lz -lm -o tile_test
$ ./tile_test
TIFFReadDirectory: Warning, Q09050_006_NIR.tif: unknown field with tag 50742 (0xc636) encountered. tileNum=0, tileSize=98304, buf=0x2124a60
successful read, size=98304
However, if I build and link with my own libtiff 4.0.0beta6 with the default configuration, I get the buffer error:
$ gcc -I ~/tiff-4.0.0beta6/libtiff tile.c ~/tiff-4.0.0beta6/libtiff/.libs/libtiff.a -ljpeg -lz -lm -o tile_test $ ./tile_test
TIFFReadDirectory: Warning, Unknown field with tag 50742 (0xc636) encountered. TIFFFetchNormalTag: Warning, ASCII value for tag "ImageDescription" does not end in null byte.
TIFFFetchNormalTag: Warning, ASCII value for tag "Software" does not end in null byte. tileNum=0, tileSize=98304, buf=0x22092b0
JPEGDecodeRaw: application buffer not large enough for all data..
ERROR!
The behaviour is consistent across a couple different versions of Fedora- built and personally-build libtiffs. Is there some special libtiff configuration needed to make YCbCr/JPEG reading work properly? I need to use a custom-built libtiff.
--------------------------+----------------------+--------------------------
Dr. Craig S. Bruce | Ph 819-771-8303 x205 | CubeWerx Inc.
Senior Software Developer | Fax 819-771-8388 | Gatineau, Québec, Canada
csbruce@cubewerx.com | http://csbruce.com/ | http://www.cubewerx.com/
--------------------------+----------------------+--------------------------
The Free Market is why Canadian flags are made in China instead of Singapore.