I can confirm that this bug exists and that this patch works. I hope it gets included in PIL 1.1.7

Stani
--
http://photobatch.stani.be

Florian Höch wrote:
Hello Guy,

PIL 1.1.6 still seems to have a bug regarding its interpretation of TIFFTAG_RESOLUTIONUNIT, which could lead to "strange" values being written to the TIFF file.

I and Gary Bloom posted fixes to the list awhile ago. For convenience, here's the diff patch for TiffImagePlugin.py again, containing both mine (reading) and Gary's (writing) fix:


577,578c577,578
<         xdpi = getscalar(X_RESOLUTION, (1, 1))
<         ydpi = getscalar(Y_RESOLUTION, (1, 1))
---
 >         xres = getscalar(X_RESOLUTION, (1, 1))
 >         yres = getscalar(Y_RESOLUTION, (1, 1))
580,583c580,589
<         if xdpi and ydpi and getscalar(RESOLUTION_UNIT, 1) == 1:
<             xdpi = xdpi[0] / (xdpi[1] or 1)
<             ydpi = ydpi[0] / (ydpi[1] or 1)
<             self.info["dpi"] = xdpi, ydpi
---
 >         if xres and yres:
 >             xres = xres[0] / (xres[1] or 1)
 >             yres = yres[0] / (yres[1] or 1)
 >             resunit = getscalar(RESOLUTION_UNIT, 1)
 >             if resunit == 2: # dots per inch
 >                 self.info["dpi"] = xres, yres
 >             elif resunit == 3: # dots per centimeter. convert to dpi
 >                 self.info["dpi"] = xres * 2.54, yres * 2.54
> else: # No absolute unit of measurement. Used for images that may
have a non-square aspect ratio, but no meaningful absolute dimensions.
 >                 self.info["resolution"] = xres, yres
721c727
<         ifd[RESOLUTION_UNIT] = 1
---
 >         ifd[RESOLUTION_UNIT] = 2


To explain what the patch does: Without the fix, PIL's interpretation of RESOLUTION_UNIT is "off by one", e.g. RESOLUTION_UNIT 1 (no absolute unit of measurement) is treated as RESOLUTION_UNIT 2 (dots per inch). The patch solves this and also takes into account RESOLUTION_UNIT 3 (dots per centimeters) by converting to dots per inch and setting info["dpi"] accordingly. In the case of RESOLUTION_UNIT other than 2 or 3, there may be no meaningful resolution set in the image. After applying the patch, this case can be checked for in your code if needed with yourimage.info.has_key("dpi") and if that returns False, checking yourimage.info["resolution"]. The fix currently has the small drawback that, if RESOLUTION_UNIT was 3 (dpc) in the input image, when saving the TIFF file the resolution unit will always be dpi.

Regards,

Florian

Guy K. Kloss schrieb:
Hi,

I've just had some problems with PIL's implementation of the Image.save() method when writing TIFF files. Apparently some internal tags on resolution are totally out of the normal. Using the TIFFs from libtiff later on produces some warning on a tag with bad information.

This is what libtiff's warning handler produces:

_TIFFVSetField: diag.tif: Bad value 47088 for "ResolutionUnit".
diag.tif: Warning, "YResolution": Information lost writing value (-2.94176e-05) as (unsigned) RATIONAL.

According to Graeme Gill's information (who implements Argyll CMS, that's using libtiff for its purposes)

"""
[...] According to the TIFF spec, the ResolutionUnit tag can have one of three
values: (From tiff/libtiff/tiff.h)

#define TIFFTAG_RESOLUTIONUNIT      296 /* units of resolutions */
#define     RESUNIT_NONE        1   /* no meaningful units */
#define     RESUNIT_INCH        2   /* english */
#define     RESUNIT_CENTIMETER      3   /* metric */
"""

It seems like the implementation in PIL.Image for save() puts a non standard value (here 47088) into the field ResolutionUnit, and there also seems to be something funny with the YResolution field in the TIFF file.

To me this very much sounds like an issue with uninitialised variables in some structures, as the values tend to be different on different runs, as well as the fact that they're well out of whack indicates this.

Guy
_______________________________________________
Image-SIG maillist  -  Image-SIG@python.org
http://mail.python.org/mailman/listinfo/image-sig

_______________________________________________
Image-SIG maillist  -  Image-SIG@python.org
http://mail.python.org/mailman/listinfo/image-sig

Reply via email to