指出我将 TIFF 转换为 PNG/JPG 时的错误

指出我将 TIFF 转换为 PNG/JPG 时的错误

这是一个输入 tiff 图像,我想将其转换为 JPG/PNG。googledrive-下载样本链接

在此输入图像描述

根据一般经验,我总是使用以下命令在两种图像格式之间进行转换(主要是 JPG 到 PNG )。convert input.jpg out.png

但:

convert input.tiff out.png

产生以下图像。您能指出为什么将 TIF 转换为 PNG 无法正常工作吗?这与色彩空间/压缩有关吗?

在此输入图像描述

以防万一:$identify input.tiff给出

input.tiff TIFF 640x480 640x480+0+0 8-bit YCbCr 619120B 0.000u 0:00.000

另外,更多信息如何制作图像:

ffmpeg -hide_banner -loglevel error -y -f video4linux2 -i /dev/video0 -vframes 1 fname.tiff;

答案1

重要的是YCbCr:色彩空间(它是视频色彩空间,而不是 RGB)不会转换,因此您生成的 PNG 在某处有色彩空间注释,而您的 PNG 查看器不支持此注释,或者您的 PNGconvert有问题并且不支持即使需要,也不进行色彩空间转换。

convert-colorspace选项,所以我首先尝试的是显式设置源和目标色彩空间,并查看它是否以这种方式转换它们。

另外,由于输入图片似乎是黑白的,请考虑转换为灰度 PNG(只需要 Y 或强度通道)。

答案2

由于色彩空间信息是 TIFF 的一部分(这部分是 T 所代表的内容:文件中有有关图像结构的实际信息,因此标记的),这意味着您的转换做错了(或者,您的输入文件以其他查看器可以“错误地”处理“成功”的方式被破坏)。

因此,解决方法是:不要使用convert/imagemagick(这也是网络历史上最大的服务器漏洞来源之一)。无论如何,根据我的经验,它非常慢。

尝试econvert来自精确图像项目。

除此之外,Python PIL / Pillow 可能工作得很好;这确实是第一个他们教程中的示例(最小修改);将其保存到文本文件,将其标记为可执行文件并在您的文件中使用它。

#!/usr/bin/env python3
import os, sys
from PIL import Image

for infile in sys.argv[1:]:
    filename, extension = os.path.splitext(infile)
    outfile = f"{filename}.jpg"
    if infile != outfile:
        try:
            with Image.open(infile) as im:
                im.save(outfile)
        except OSError:
            print(f"cannot convert {infile}")

答案3

我发现的解决方案是,首先转换YCbCrRGBA使用tiff2rgba。 (包含在libtiff包装中)。然后将该 RGB tiff 转换为任何其他格式。

$ tiff2rgba input.tiff out.tiff
$ convert out.tiff final.png

附加信息:

$ identify input.tiff
input.tiff TIFF 640x480 640x480+0+0 8-bit YCbCr 618733B 0.000u 0:00.000
$ identify out.tiff
out.tiff TIFF 640x480 640x480+0+0 8-bit sRGB 858070B 0.000u 0:00.000

如果您有更简洁的答案,例如仅使用imagemagickwithout tiff2rgba,或者甚至知道为什么会发生这种情况,请随时分享。谢谢。

相关内容