1999.04.22 20:54 "JPEG'd TIFF problems on Mac", by Eric Shapiro
I am still having problems writing JPEG'd TIFF files on a Mac.
My TIFF files have the directory shown below. The stripoffsets and stripbytecounts appear "interesting" and possibly wrong.
Does this problem look familiar to anyone?
I do not get an error writing the file, but I cannot read it back in and neither can Adobe ImageReady. The source code is also shown below.
Thanks!
Eric Shapiro
shapiro@relium.com
--------- the file directory ------------
Dumping TIFF file...
Magic Word= 'MM' (Motorola)
directory offset=$137e
numDirEntries=15
DirEntry (0): IMAGEWIDTH type=<short> count=1 value=$140
DirEntry (1): IMAGELENGTH type=<short> count=1 value=$f0
DirEntry (2): BITSPERSAMPLE type=<short> count=3 value=$8 8 8
DirEntry (3): COMPRESSION=NEWJPEG type=<short> count=1 value=$7
DirEntry (4): PHOTOMETRIC=YCBCR type=<short> count=1 value=$6
DirEntry (5): STRIPOFFSETS type=<long> count=3 value=$8 0 0
DirEntry (6): ORIENTATION=$1 type=<short> count=1 value=$1
DirEntry (7): SAMPLESPERPIXEL=3 type=<short> count=1 value=$3
DirEntry (8): STRIPBYTECOUNTS type=<long> count=3 value=$1375 0 0
DirEntry (9): MINSAMPLEVALUE type=<short> count=3 value=$0 0 0
DirEntry (10): MAXSAMPLEVALUE type=<short> count=3 value=$ff ff ff
DirEntry (11): PLANARCONFIG=1 type=<short> count=1 value=$1
DirEntry (12): TIFFTAG=305 type=<ascii> count=5 value=$0 1 0 ff 0
DirEntry (13): JPEGTABLES type=<undef> count=574 value=$0 1 0 ff etc etc
DirEntry (14): REFERENCEBLACKWHITE=0 type=<rational> count=6
value=$100ff/ff0000[0.00393683] 0/91bf758[0] 92087c0/ab800008[0.0532191]
80/48a80[0.000430108] 920/81ecc001[1.07167e-06] 91bf7f0/8000[4663.94]
---------- the source code (stripped a bit) ---------------
theTIFF = TIFFFdOpen( fileID, "TIFFWriteTest", "w" );
if ( theTIFF == 0 ) { DebugStr( "\pTIFFFdOpen failed." ); goto DONE; }
fileID = 0; // it now belongs to TIFF code
TIFFSetField(theTIFF, TIFFTAG_COMPRESSION,COMPRESSION_JPEG);
TIFFSetField(theTIFF, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_YCBCR);
TIFFSetField(theTIFF, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB);
TIFFSetField(theTIFF, TIFFTAG_IMAGEWIDTH, kWidth);
TIFFSetField(theTIFF, TIFFTAG_IMAGELENGTH, kHeight);
TIFFSetField(theTIFF, TIFFTAG_BITSPERSAMPLE, 8);
TIFFSetField(theTIFF, TIFFTAG_SAMPLESPERPIXEL, 3);
TIFFSetField(theTIFF, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
TIFFSetField(theTIFF, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(theTIFF, TIFFTAG_SOFTWARE, "Spot");
TIFFSetField(theTIFF, TIFFTAG_MINSAMPLEVALUE, 0);
TIFFSetField(theTIFF, TIFFTAG_MAXSAMPLEVALUE, 255);
// note: the gworld is already locked
PixMapHandle theMap = GetGWorldPixMap( theWorld );
int rowBytes = (**theMap).rowBytes & 0x3FFF;
unsigned char * sourceBuffer = (unsigned char*) GetPixBaseAddr( theMap );
destRowBuffer = (unsigned char*) _TIFFmalloc( 3 * kWidth );
if ( !destRowBuffer ) { DebugStr( "\pCan't allocate row buffer" ); goto
DONE; }
for ( int rowCount = 0; rowCount < kHeight; rowCount++ )
{
unsigned char *destRowPtr = destRowBuffer;
unsigned long *sourceRowPtr = (unsigned long*)( sourceBuffer + rowCount *
rowBytes );
for ( int colCount = 0; colCount < kWidth; colCount++ )
{
unsigned long pixelValue = sourceRowPtr[ colCount ];
*destRowPtr++ = (pixelValue >> 16) & 0xFF;
*destRowPtr++ = (pixelValue >> 8) & 0xFF;
*destRowPtr++ = (pixelValue & 0xFF);
}
if ( TIFFWriteScanline( theTIFF, destRowBuffer, rowCount, 0 ) < 0 )
{
DebugStr( "\pTIFFWriteScanline failed." );
goto DONE;
}
}
if ( TIFFWriteDirectory(theTIFF) == 0 )
{
DebugStr( "\pCan't write directory." );
goto DONE;
}