Hi Paavo, Thanks a lot for your response. I understand that writing a single strip of large size is not recommended. I will keep that in mind. However,
1. One correction to my previous email. The results that I shared in my last email are from libTIFF version 4.0.0 (an older version). When I tried to use 4.2.0, I didn't get the weird results of RowsPerStrip changing after writing Uncompressed TIFF file on Windows, the LZW compression issue remained the same. However, with 4.2.0 and using Linux, I see the same issue of changed RowsPerStrip when writing uncompressed data. Not sure why this is happening. 2. In case of LZW compression, as you said there is some 32-bit counter which is not capable of handling this large strip size - could it be different on different platforms? I am not seeing the issue of corrupted file on Linux platform, only on Windows. May be some overflow happening depending on the size of the counter and how that size is interpreted on different platforms? 3. Keeping in mind your recommendation, do you think this behavior should be reported as a libTIFF bug (functionality wise)? Thanks again, Nalini From: [email protected] <[email protected]> Sent: Wednesday, December 8, 2021 10:00 AM To: Nalini Vishnoi <[email protected]>; [email protected] Subject: RE: [Tiff] Windows - difference in behavior when large RowsPerStrip is specified while writing Uncompressed vs LZW compressed TIFF file Hi Nalini, You are attempting to write a single strip of ca 2.5 G pixels. This is not a wise thing to do. Most probably there is some 32-bit counter somewhere which cannot cope with such sizes, probably in the LZW compression routines. For such large files one should use the tiled format and write e.g. 512x512 pixel tiles. This enables the reader to "zoom in" into the image by reading only a few tiles. This is widely used in "pyramidal" TIFF files of various kinds. Another option would be to just write smaller strips, but for such large images the tiles would be the right approach. HTH Paavo From: Tiff <[email protected]<mailto:[email protected]>> On Behalf Of Nalini Vishnoi Sent: kolmapäev, 8. detsember 2021 05:38 To: [email protected]<mailto:[email protected]> Subject: [Tiff] Windows - difference in behavior when large RowsPerStrip is specified while writing Uncompressed vs LZW compressed TIFF file Hello everyone, I am writing to understand a behavior I observed on Windows with libTIFF. I am using libTIFF 4.2.0. I write a TIFF file with RowsPerStrip=25000 using two different ways: 1. Uncompressed 2. Using LZW compression. When the file is written without any compression, RowsPerStrip is automatically changed to 1 from 25000 while writing the file. See the output of the code added below (in case of writing uncompressed file): Status after setting rowsPerStrip = 1 Status after reading rowsPerStrip = 1 Rows per strip = 25000 Size of strip = 2500000000 NumStrips = 1 Status after writing the file = 2500000000 NumStrips = 25000 Size of strip = 100000 Rows per strip = 1 Status after reading the image = 100000 However, when I use LZW compression, the written file become corrupted: Status after setting rowsPerStrip = 1 Status after reading rowsPerStrip = 1 Rows per strip = 25000 Size of strip = 2500000000 NumStrips = 1 Status after writing the file = 2500000000 NumStrips = 1 Size of strip = 2500000000 Rows per strip = 25000 Status after reading the image = -1 Are these results expected (RowsPerStrip automatically changing its value AND the file getting corrupted with LZW compression)? Please let me know if I any additional information is needed. I look forward to your reply. Thanks, Nalini Here is my code: #include<stdlib.h> #include<tiffio.h> #include<tiff.h> #include<iostream> #include<vector> #define FILENAME "mytest.tif" int main() { TIFF* tif = TIFFOpen(FILENAME, "w"); std::vector<uint16_t> v(1,0); tsize_t rowsPerStrip=0, stripSize; int64 status = -10; TIFFSetField(tif,TIFFTAG_PHOTOMETRIC, 2); TIFFSetField(tif,TIFFTAG_BITSPERSAMPLE, 8); TIFFSetField(tif,TIFFTAG_IMAGELENGTH, 25000); TIFFSetField(tif,TIFFTAG_IMAGEWIDTH, 25000); TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL, 4); TIFFSetField(tif,TIFFTAG_PLANARCONFIG, 1); status = TIFFSetField(tif,TIFFTAG_ROWSPERSTRIP, uint32_t(25000)); std::cout << "\nStatus after setting rowsPerStrip = "<< status ; status = TIFFGetField(tif,TIFFTAG_ROWSPERSTRIP, &rowsPerStrip); std::cout << "\nStatus after reading rowsPerStrip = "<< status ; std::cout<<"\nRows per strip = "<< rowsPerStrip; // LZW compression // TIFFSetField(tif,TIFFTAG_COMPRESSION, 5); TIFFSetField(tif,TIFFTAG_EXTRASAMPLES, v.size(), &v[0]); tsize_t numBytes = tsize_t(25000)*25000*4; stripSize = TIFFStripSize(tif); std::cout<<"\nSize of strip = "<<stripSize; std::vector<uint8_t> writeBuffer(stripSize, 10); tstrip_t numStrips = TIFFNumberOfStrips(tif); std::cout << "\nNumStrips = " << numStrips; tdata_t buffer = static_cast<tdata_t>(&writeBuffer[0]); status = TIFFWriteEncodedStrip(tif, 0, buffer, numBytes ); std::cout << "\nStatus after writing the file = "<< status <<'\n'; TIFFClose(tif); tif = TIFFOpen(FILENAME, "r"); numStrips = TIFFNumberOfStrips(tif); std::cout<< "\nNumStrips = "<<numStrips; stripSize = TIFFStripSize(tif); std::cout<<"\nSize of strip = "<<stripSize; TIFFGetField(tif,TIFFTAG_ROWSPERSTRIP, &rowsPerStrip); std::cout<<"\nRows per strip = "<<rowsPerStrip; status = TIFFReadEncodedStrip(tif, 0, &writeBuffer[0], -1); std::cout<<"\nStatus after reading the image = "<<status<<'\n'; TIFFClose(tif); }
_______________________________________________ Tiff mailing list [email protected] https://lists.osgeo.org/mailman/listinfo/tiff
