【问题标题】:Python PIL incorrectly decoding TIFF colors (using incorrect colorspace)?Python PIL 错误地解码 TIFF 颜色(使用不正确的颜色空间)?
【发布时间】:2012-10-18 13:15:59
【问题描述】:

当我使用PIL==1.1.7 加载 TIFF 图像时,似乎颜色空间错误:

发生了什么事?

  • .tiff 是使用 convert test.jpg test.tiff 创建的(但似乎也适用于其他 tiff 文件)
  • 可以在以下位置找到:http://hul.wolever.net/dump/test.tiff
  • PIL.Image.DEBUG = True时的输出:
>>> 从 PIL 导入图像 >>> Image.DEBUG = True >>> Image.open("/tmp/test.tiff").show() 标签:ImageWidth(256)-类型:短(3)-值:(560,) 标签:ImageLength(257)-类型:短(3)-值:(401,) 标签:BitsPerSample (258) - 类型:短 (3) - 值:(8, 8, 8) 标签:压缩(259)-类型:短(3)-值:(7,) 标签:PhotometricInterpretation(262)-类型:短(3)-值:(2,) 标签:FillOrder (266) - 类型:短 (3) - 值:(1,) 标签:DocumentName (269) - 类型:ascii (2) - 值:/tmp/lemur.tiff 标签:StripOffsets (273) - 类型:long (4) - 值:(8, 9282, 18712, 28312, 38000, 48730, 59052, 70406, 83010, 95978, 108967, 121029, 133136, 1455555, 1574179, 1574194, , 191157, 202954, 214664, 226914, 238919, 250547, 261871, 273282, 284453) 标签:方向(274)-类型:短(3)-值:(1,) 标签:SamplesPerPixel(277)-类型:短(3)-值:(3,) 标签:RowsPerStrip(278)-类型:短(3)-值:(16,) 标签:StripByteCounts (279) - 类型:long (4) - 值:(9274, 9430, 9600, 9688, 10730, 10322, 11354, 12604, 12968, 12989, 12062, 12107, 12419, 11856, 10878, 1178, 11742 , 11797, 11710, 12250, 12005, 11628, 11324, 11411, 11171, 2541) 标签:XResolution (282) - 类型:有理数 (5) - 值:((1207959552, 16777216),) 标签:YResolution (283) - 类型:理性 (5) - 值:((1207959552, 16777216),) 标签:PlanarConfiguration(284)-类型:短(3)-值:(1,) 标签:ResolutionUnit(296)-类型:短(3)-值:(1,) 标签:PageNumber (297) - 类型:短 (3) - 值:(0, 1) 标签:JPEGTables(347)-类型:未定义(7)-值:????C?? ???}!1AQa"q2??#B??R??$3br? %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz????????????????????????????????????????????? ???????????????????????????????????? 标签:YCbCrSubSampling (530) - 类型:短 (3) - 值:(2, 2) *** 概括 *** - 压缩:JPEG - photometric_interpretation:2 - 平面配置:1 - 填充订单:1 - 尺寸:(560、401) 格式键:('II', 2, 1, 1, (8, 8, 8), ()) - 原始模式:RGB - pil模式:RGB

【问题讨论】:

  • 你会因为向我介绍Image.DEBUG而获得+1。
  • 在我看来是原始来源的问题。我尝试使用您的图像并获得相同的结果。但是,尝试使用另一个 tiff,或在 jpg 上运行 convert 会产生预期的结果。
  • @sberry。 tiff 不是单一格式。它实际上更像是一个灵活的容器,可以利用多种压缩和图像类型。我认为这可能不是文件本身的问题,因为我桌面的图像查看程序可以按预期显示文件。
  • 除了 Vladimir Sinenko 的回答之外,这个问题可以通过在从 jpeg 转换为 tiff 时指定颜色空间来规避,例如 convert test.jpg -colorspace sRGB test.tiff

标签: python python-imaging-library tiff


【解决方案1】:

这很可能是因为您的 TIFF 图像包含由 Adob​​e Photoshop 生成的压缩 JPEG 数据,该数据使用特殊标记来指示正确的色彩空间。我猜 PIL 不知道这个标记(至少在嵌入 TIFF 的 JPEG 中),所以它假设图像在 YCbCr 颜色空间中(我们可以在屏幕截图中看到)。

查看详细回答here,相信正是你的情况。

您可能的解决方案是使用其他方法转换您的 JPEG(没有压缩的 JPEG 数据)。例如,如果 PIL 能够正确打开您的 JPEG,您可以使用 PIL 重写 TIFF:

from PIL import Image
img = Image.open("test.jpg")
tif = Image.new("RGB", img.size)
tif.paste(img)
tif.save('result.tiff')

【讨论】:

  • OP 声明图像是使用convert 实用程序在命令行上创建的。据我了解这个问题,我认为问题在于让 PIL 读取转换后的 tiff 文件,而不是找到更好的转换方法。
  • @Steven,我相信没有快速的方法可以让 PIL 正确读取此文件。我曾尝试在TiffImagePlugin.py 的 TIFF 阅读期间伪造图像模式,但无济于事。底层 PIL 二进制文件以同样的方式解码嵌入的 jpeg。很抱歉,我帮不上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
相关资源
最近更新 更多