やりたかったこと
PNG⇛JPEGをする。
今回問題となったのは、PNG画像の拡張子をJPEGに変えてるだけで、内部情報はPNGのままで怒られてしまった。
そのため、JPEGにしっかり変換する(新卒並感)
解決
以下OpencvでJPEG変換するコード。今回エラーとなっていたのは、imwriteする時に保存先をしている第一引数を変数でhogehoge.pngを指定し、無限ループが起きていた。(for文で第四引数のクオリティを下げて画像サイズを小さくしていた。)
第一引数の拡張子は.jpgにしよう(戒め)
# 該当PNG画像
image = cv2.imread('hoge.png')
# JPG画像として保存する
cv2.imwrite('hoge.jpg', image, [int(cv2.IMWRITE_JPEG_QUALITY), 95])
しかし、これでちゃんと中身までJPEGに変換されているかは確認できない。怪しいし、動作確認でのエビデンスはどうしよう・・・・
というわけで下記サイトに出会った。どうやらバイナリの先頭部分(シグネチャ)で判定できるらしい。
# ファイル読み込み
with open(image_file_path, mode='rb') as f:
image = f.read()
# バイナリ変換した画像ファイルをターミナルに表示してみる
print("hoge.jpeg =>" + str(image[:8]))
先頭が「\xff\xd8」であればJPEG、「\x89PNG\r\n\x1a\n」であればPNGとなっているようなので、そちらをコンソールで確認。
以下の記事が詳しそうだったので後々読みたい。