这是一个输入 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(这也是网络历史上最大的服务器漏洞来源之一)。无论如何,根据我的经验,它非常慢。
除此之外,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
我发现的解决方案是,首先转换YCbCr
为RGBA
使用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
如果您有更简洁的答案,例如仅使用imagemagick
without tiff2rgba
,或者甚至知道为什么会发生这种情况,请随时分享。谢谢。