0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PythonでOpenImageIO(OIIO)を使ってOpenEXRをJPEGに変換する

Last updated at Posted at 2022-11-27

自己紹介

株式会社digitalbigmoのパイプラインエンジニアの小池@plinecomです。

これは何?

私はOpenEXR推しの人なんだけれど、OpenEXRを簡単にプレビューできないことは良くあるので、JPEGあたりに変換したいと思ったのだ。でも、すでに何千万枚もあるし、今後も増えるので、Pythonで処理したい。そこで、普通はOpenCVってなるところなんだけど、OpenImageIOという便利そうな仕組みがある事を知ったので、こちらを利用することにした。OpenImageIOの方が対応しているファイル形式も多いし、画像データをNumPy配列で扱うので、後々色々便利だと思うのだ。特にDPXにも対応しているっぽいのがポイント高いと思った。

コード(低レベルAPI版)

low.py
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版)

high.py
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も用意した。

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
terminal
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ページを見にきてください。一緒にお仕事しましょう。

参考文献

OpenImageIO本家(英語)
OpenImageIO本家リファレンス(英語)

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?