1. 製品
  2.   画像
  3.   C++
  4.   OpenImageIO
 
  

オープン ソース C++ API による画像処理と変換

無料の C++ ライブラリを介して、PNG、JPEG、BMP、TIFF などの一般的な画像形式を読み取り、書き込み、変換します。

OpenImageIO は、ソフトウェア開発者が C++ アプリケーション内で一般的な画像ファイル形式を読み取り、書き込み、処理できるようにする強力な画像処理ライブラリです。プラグインを介して、いくつかの一般的な画像形式のサポートを提供します。 OpenEXR、TIFF、JPEG/JFIF、PNG、BMP、JPEG-2000、ICO、PNM、DPX、IFF、Field3D、Ptex、Photoshop PSD、GIF などの一般的な画像形式をサポートします。

OpenImageIOライブラリは、世界中のアニメーションとFXスタジオで広く使用され、数多くの商用製品にも統合されています。 OpenImageIO ライブラリには、複数のコマンドラインイメージツールが付属しており、画像のフォーマットを他の人に変換したり、2つの画像を比較したり、詳細な情報を印刷したり、マッチメタデータ、シンプルな画像ビューアなどの画像を検索したりすることができます。

Previous Next

OpenImageIO の使用を開始する

OpenImageIO ビルド システムは CMake に基づいています。システムにインストールする必要がある場合。 OpenImageIO をビルドした後、EMBEDPLUGINS=0 フラグを指定してコンパイルした場合は、環境変数 OIIO_LIBRARY_PATH を、OpenImageIO がインストールされている「lib」ディレクトリを指すように設定する必要があります。そうしないと、プラグインを見つけることができなくなります。

git コマンドで OpenImageIO をインストールする

 git clone https://github.com/OpenImageIO/oiio.git 

C++ API による画像の読み取りと書き込み

OpenImageIO ライブラリを使用すると、プログラマは画像の読み取りと書き込みを行うことができるだけでなく、後の画像が出力で外部的に生成される方法を制御することもできます。通常、ライブラリによって読み取られるすべての画像は、基になる ImageCache によってサポートされる ImageBuf に読み取られ、内部ストレージ用に float ピクセルに自動的に変換されます。画像の書き込み中は、現在の画像を指定されたファイルに出力するだけです。画像処理ライブラリは、現在の画像を画像スタックから削除しません。コピーを保存するだけです。

C++ APIによる高度な画像読み取り<

#include 
using namespace OIIO;
...
const char *filename = "foo.jpg";
auto inp = ImageInput::open (filename);
if (! inp) {
    std::cerr << "Could not open " << filename
              << ", error = " << OIIO::geterror() << "\n";
    return;
}
const ImageSpec &spec = inp->spec();
int xres = spec.width;
int yres = spec.height;
int channels = spec.nchannels;
std::vector pixels(xres * yres * channels);
if (! inp->read_image (TypeDesc::UINT8, &pixels[0])) {
    std::cerr << "Could not read pixels from " << filename
              << ", error = " << inp->geterror() << "\n";
    return;
}
if (! inp->close ()) {
    std::cerr << "Error closing " << filename
              << ", error = " << inp->geterror() << "\n";
    return;
}

画像を他の形式に変換する

OpenImageIO ライブラリは、画像を他の一般的なファイル形式に変換する機能を提供します。サポートされている画像フォーマット間の変換は非常に簡単です。 iconvert ユーティリティは、画像を読み取り、その画像をサポートされている新しいファイル形式に書き込みます。ファイル拡張子からファイル形式を推測するだけです。画像のキャプション、説明、キーワード、またはメタデータを含めることができます。

C++ 経由で画像メタデータを変更する

OpenImageIO API は、ソフトウェア開発者が、オープンソース API を使用して、独自の C++ アプリケーション内で現在のイメージメタデータを変更できるようにします。 既存の画像のメタデータを変更するコマンドを提供しますが、ピクセル値を変更しません。 良いことは、現在のイメージ(スタックの上部にある画像)のみがスタックをダウンしないということです。 キーワードを追加またはクリアしたり、キャプションや説明を追加したり、メタデータを削除したりすることもできます。

C++を介して画像メタデータを設定する方法

// spec["key"] = value  sets the value of the metadata, using
// the type of value as a guide for the type of the metadata.
spec["Orientation"] = 1;   // int
spec["PixelAspectRatio"] = 1.0f;   // float
spec["ImageDescription"] = "selfie";  // string
spec["worldtocamera"] = Imath::M44f(...)  // matrix

C++ API による画像上の図形またはテキストを描画する

あなたの画像を有用なタイトルでラベルを付けたり、画像を透かししたりして、許可されていない使用から保護したりするのが非常に便利です。 オープンソースのOpenImageIOライブラリには、図形、ポイント、線、ボックス、テキストなどを画像の上に簡単に描画するための重要な機能がいくつか含まれています。 画像上に図形を描画したり、複数のコードの行でテキストを追加したりできます。 次のコードの例では、テキストをイメージの上に描画し、それを整列する方法を示します。

テキストを C++ API を介して画像を描画する方法

ImageBufAlgo::render_text (ImgA, 50, 100, "Hello, world");
float red[] = { 1, 0, 0, 1 };
ImageBufAlgo::render_text (ImgA, 100, 200, "Go Big Red!",
                           60, "Arial Bold", red);
float white[] = { 1, 1, 1, 1 };
ImageBufAlgo::render_text (ImgB, 320, 240, "Centered",
                           60, "Arial Bold", white,
                           TextAlignX::Center, TextAlignY::Center);
 日本