自己紹介
株式会社digitalbigmoのパイプラインエンジニアの小池@plinecomです。
これは何?
私はOpenEXR推しの人なんだけれど、OpenEXRを簡単にプレビューできないことは良くあるので、JPEGあたりに変換したいと思ったのだ。でも、すでに何千万枚もあるし、今後も増えるので、Pythonで処理したい。そこで、普通はOpenCVってなるところなんだけど、OpenImageIOという便利そうな仕組みがある事を知ったので、こちらを利用することにした。OpenImageIOの方が対応しているファイル形式も多いし、画像データをNumPy配列で扱うので、後々色々便利だと思うのだ。特にDPXにも対応しているっぽいのがポイント高いと思った。
コード(低レベルAPI版)
import OpenImageIO as oiio
import glob
if __name__ == '__main__':
for path in glob.glob('/foo/bar/*.exr'):
print(path)
jpg_path = path.replace('.exr', '.jpg')
#Read File
inp = oiio.ImageInput.open(path)
spec = inp.spec()
pixels = inp.read_image("float")
inp.close()
#Write File
out = oiio.ImageOutput.create(jpg_path)
out.open(jpg_path, spec)
out.write_image(pixels)
out.close()
コード(高レベルAPI版)
import OpenImageIO as oiio
import glob
if __name__ == '__main__':
for path in glob.glob('/foo/bar/*.exr'):
print(path)
jpg_path = path.replace('.exr', '.jpg')
#Read File
buf = oiio.ImageBuf(path)
#Write File
buf.write(jpg_path)
必要なPython外部モジュール
- OpenImageIO
- NumPy
Dockerfileも用意した。
FROM rockylinux:8
RUN dnf install -y which python3 epel-release
RUN dnf config-manager --set-enabled powertools
RUN dnf install -y python3-openimageio python3-numpy
docker pull plinecom/py_oiio
低レベルAPI版のコードの説明
NumPyの配列を取ろうとするなら、低レベルAPIを使う方が早い。(高レベルAPIからNumPy配列を取る方法もある)
EXRファイルの読み込み方法の指示
#Read File
inp = oiio.ImageInput.open(path)
spec = inp.spec()
pixels = inp.read_image("float")
inp.close()
read_image()関数から取得できるオブジェクトpixelはNumPy配列である。せっかくOpeEXRなので、画像データはfloat型で出してもらうように指示を出している。
画像の書き出しと変換方法の指示
#Write File
out = oiio.ImageOutput.create(jpg_path)
out.open(jpg_path, spec)
out.write_image(pixels)
out.close()
書き出し先とファイル名を指示する。拡張子をもとに画像形式を自動で処理してくれるので、拡張子を変えれば、OpenImageIOが対応している形式に出してくれる。
高レベルAPI版のコードの説明
特にない。読み書きそれぞれ1行しかないし、見ればわかるはず。
宣伝
株式会社digitalbigmoでは美肌プラグインの販売や映像VFXの制作業務を行なっています。ご興味のある方は、webページを見にきてください。一緒にお仕事しましょう。