Blenderの画像とPythonあれこれ
PNG画像をJPEGで保存するとき
ファイルサイズを圧縮するために、PNGファイルをJPEGで保存すると、色合いが変化することがありました。
完全な解決方法かはわからないですが、下記のようにしたら改善しました。
- レンダープロパティのカラーマネジメントのビュー変換をFlimicから標準に変える
変更前 | 変更後 | |
---|---|---|
→ |
Pythonの場合
bpy.context.scene.view_settings.view_transform = "Standard" # 標準に設定
# 画像保存
bpy.context.scene.view_settings.view_transform = "Filmic" # Flimicに戻す
品質などを指定して画像を保存
画像を保存するときに、ダイアログでフォーマットやカラーや品質を設定できます。
Pythonでこれを実現するとします。Imageオブジェクトのsave()
メソッドには引数がなく、オブジェクトの属性にもこれらの項目はありません。これらを設定するには、下記のようにする必要があるようです。
stng = bpy.context.scene.render.image_settings
stng.file_format = フォーマット # ex. "JPEG", "PNG"
stng.color_mode = カラー # ex. "BW", "RGB", "RGBA"
stng.quality = 品質 # 0-100
img = bpy.data.images[対象画像]
img.save_render(パス, scene=bpy.context.scene)
color_mode
の設定では、先にfile_format
を決定する必要があることに注意してください。
たとえば、file_format == "JPEG"
のときに、color_mode
を"RGBA"
にするとエラーになります。
なお、color_mode == "RGBA"
のときにfile_format
を"JPEG"
にすると、color_mode
が"RGB"
に変わるだけでエラーにはなりません。
アルファがあるかどうかの判定
画像がアルファを持っているかどうかを直接表す属性はないようですが、下記のようにして判定できました。ただし、JPEGとPNGのいくつかの種類でのみ確認しています。
img = bpy.data.images[対象画像]
has_alpha = img.depth // (img.is_float * 3 + 1) // 8 % 2 == 0
調べた範囲では、img.depth // (img.is_float * 3 + 1) // 8
は、1, 2, 3, 4
の値を取り、それぞれ、「1色、1色+α、3色、3色+α」でした。
以上