我们在 java 应用程序中使用 FFMPEG,我正在尝试将 tiff 文件转换为 jpg,但要求保持与原始 tiff 文件相同的 DPI。
我是 FFMPEG 的新手,尝试了以下尝试但失败了:
ffmpeg -y -i test.tif test.jpg
:成功转换为 jpg,但 DPI 已从 300 降低至 96。(通过右键单击图像 --> 属性 --> 详细信息选项卡 --> 水平和垂直分辨率属性进行验证)ffmpeg -y -i test.tif -c:v copy test.jpg
:转换为 300 dpi 的 jpg,但实际文件格式仍为 tif。似乎只有扩展名更改为 jpg。ffmpeg -y -i test.tif -pix_fmt <format> test.gif
(尝试了所有 3 种支持的格式:yuvj420p、yuvj422p yuvj444p):转换为 jpg 但 dpi 从 300 更改为 96。ffmpeg y -i test.tif -r 1 -q:v <range> test.jpg
(尝试了各种范围:1 到 10):同样的问题。尝试了
-q:v
各种-qscale
选项,但它只是改变了图像的宽度和高度。
最后我听说了 ImageMagick,并且通过使用以下命令在第一次尝试中解决了问题:
magick convert "test.tif" "test.jpg"
:转换为jpg,dpi为300。
是否可以使用 FFMPEG 实现相同的功能。如果可以,请帮助我,因为我在这里被困了很长时间。
答案1
需要注意的是,DPI 与图像中的数据无关。它是基于硬件输出能力的构造。图像具有许多单个像素,文件中有这些像素的数据。一英寸内有多少像素的测量只对打印机的输出或设备上的显示器有影响。图像数据本身没有固有的像素“大小”。某些图像文件格式支持可以包含“DPI”的元数据,但这对图像本身来说基本上毫无意义。
您看到的 DPI 信息可以由您用来显示图像文件的程序任意分配。如果您的绘图程序显示图像为 300 DPI,这可能与文件中的数据无关,因为文件中的数据可能没有 DPI 标签。TIFF 文件可以包含元数据标签(这就是格式为“标记图像文件格式”的原因),例如 DPI,但这与图像数据无关。
这些概念似乎特别难让人理解,但事实上,图片元素(像素)没有大小——只有输出设备才有 DPI 测量值。我怀疑,您要求不改变 DPI 是某些人认为需要保存数据的想法。顺便说一句,由于 JPEG 是一种有损压缩方案,因此您应用的压缩量比某些任意的 DPI 元数据重要得多。在以 JPEG 格式压缩这些图像并保留 DPI 标签时,您可能会破坏这些图像。