2006.01.17 20:17 "Re: [Tiff] TiffReadEncodedStrip - problem in Delphi", by Patryk Palasz
Nevertheless, Bob is right. You should in no case reverse bits - LibTiff is doing it for you, and so you repeating that work in your own code is in vain and in error, even if it doesn't influence the decoding of this particular file. So it is best to note.
OK - you are both right. Simply I didn't know about TiffReverseBit - so I wrote my own - of course unecesarly :)
Apart from the unwanted bitorder swapping thing, there are at least two other problem here.
- If the decoding of a particular strip fails, your BitmapBuff pointer is not incremented. Thus, the following strip gets read in a position that is too high. A better solution would involve filling the 'error area' with an 'error color', which may be white, and reading the next strip in the proper position.
Right - but it is not easy to find out the size of not decoded stripe.
- TIFFReadEncodedStrip aligns each line on a byte boundary, as is customary in TIFF. However, in a Windows DIB lines are aligned on 32bit boundaries.
This is the answer I was waiting for! :) Thank you very much! Can I ask what are the other differences (except line order and 32bit aligned)
between TIFF strip and Windows DIB (VCL Bitmap)?
- To cure your problem, I recommend reading strips into a temporary buffer. Instead of the ChangeLinesOrder routine, copy lines one by one from this temporary buffer to your bitmap, taking into account that
> lines in the temporary buffer are byte aligned.
In fact ChangeLinesOrder did what you sugested (Buff variable is reused temporary buffer),
but I treated BitmapBuff as a regular buffer instead of using Bitmap.ScanLine property to write a single line.
I have one more question. Do you think that using TiffReadScanline could improve the reading performance (or at least would have the same performance)? In case of one-strip big files temporary buffer becomes quite ...big - that's why I think about TiffReadScanline.
Once again - thank you very much.
Best regards - Patryk Palasz.