私たちは 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
理解しておくべきことの 1 つは、DPI はイメージ内のデータとは何の関係もないということです。これはハードウェアの出力機能に基づく構造です。イメージには多数の個別のピクセルがあり、ファイルにはそのデータがあります。1 インチに収まるピクセル数の測定は、プリンタでの出力またはデバイス上のディスプレイでのみ重要です。イメージ データ自体には、ピクセルの固有の「サイズ」はありません。一部のイメージ ファイル形式は、「DPI」を含めることができるメタデータをサポートしていますが、これは基本的にイメージ自体には無意味です。
表示される DPI 情報は、画像ファイルを表示するために使用しているプログラムによって任意に割り当てられます。ペイント プログラムで画像が 300 DPI であると表示される場合、ファイル内のデータには DPI タグがない可能性があり、そのデータとは関係がない可能性があります。TIFF ファイルには、DPI などのメタデータ タグ (形式が「タグ付き画像ファイル形式」である理由) を含めることができますが、これは画像データには関係ありません。
これらの概念は、人々にとって特に理解しにくいようですが、実際には、画像要素 (ピクセル) にはサイズがありません。DPI 測定があるのは出力デバイスだけです。DPI を変更しないという要件は、データ保存の要件に対する誰かの考えだと思います。ちなみに、JPEG は非可逆圧縮方式であるため、適用する圧縮の量は、任意の DPI メタデータよりもはるかに重要です。DPI ラベルを保存しながら JPEG 形式で圧縮すると、これらの画像が破壊される可能性があります。