入力されたTIFF画像ですがJPG/PNGに変換したいです。googledrive - ダウンロードサンプルリンク
通常、私は2つの画像フォーマット(主に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ビューアがこのコメントをサポートしていないか、PNGにconvert
問題があるためサポートしていないことです。必要に応じて色空間変換をサポートします。
convert
オプションがあるので、-colorspace
最初に試したことは、ソースとターゲットの色空間を明示的に設定し、その方法で変換されたことを確認することでした。
また、入力画像が白黒で表示されるので、グレースケールPNGに変換することを検討してください(Yまたは強度チャンネルのみが必要です)。
答え2
色空間情報はTIFFの一部なので(この部分はTの略です。ファイルには画像構造に関する実際の情報があるため目立つ)、これは変換が間違っていることを意味します(または他のビューアが「成功」を「間違って」処理できるように入力ファイルが破損しています)。
したがって、解決策は次のとおりです。convert
/imagemagick(Webの歴史上最大のサーバー脆弱性ソースの1つ)を使用しないでください。とにかく私の経験では非常に遅いです。
それ以外の場合は、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
なしで使用するなど、より簡潔な答えがあるか、tiff2rgba
なぜこのようなことが発生するのかを知っている場合は、自由に共有してください。ありがとうございます。