概要
C/C++ にて 画像ファイルを読み込む方法をまとめた。
画像ファイルを読み込んで、GTK window または
OpenGL window に表示する。
-
方法1
FreeImage や Devil などの汎用的な画像ライブラリを使用する -
方法2
OpenCV など画像読み込み機能を持つライブラリを使用する -
方法3
linjpeg や libpng など特定の画像形式の画像ライブラリを使用する -
方法4
ライブラリを使用せず、自作する
bmp や tga などのファイル構造が簡単で非圧縮の画像形式は、C++ の標準関数で作成することができる。
MAC にて動作確認したコードを Github に公開した。
https://github.com/ohwada/MAC_cpp_Samples/blob/master/ImageLoader.md
FreeImage
汎用的な画像ライブラリ
対応している画像ファイルの形式。
http://freeimage.sourceforge.net/features.html
パッケージ管理ツールでインストールできる。
MACの例:
brew install freeimage
ライセンスは GNUとのFIPLの2本立て
-
GNU( GNU General Public License, version
2.0or version 3.0) -
FreeImage Public License (FIPL)
http://freeimage.sourceforge.net/freeimage-license.txt最新版は 3.18.0(2018年7月)
MAC ユーザーは要注意です。
赤と青が入れ替わるというバグがある。
内部の FIBITMAP 形式は、上下逆の座標です。
PDF: FreeImage 3.17.0 documentation
読み込んだあと、赤と青が入れ替えるという対策をしたコードを Github に公開した。
https://github.com/ohwada/MAC_cpp_Samples/tree/master/FreeImage
Devil
Developer's Image Library
汎用的な画像ライブラリ
対応している画像ファイルの形式。
http://openil.sourceforge.net/features.php
パッケージ管理ツールでインストールできる。
MACの例:
brew install devil
ライセンスは LGPL(GNU LESSER GENERAL PUBLIC LICENSE)
最新版は 1.8.0(2017年1月)
注意
上下逆に保存するというバグがある。
DevIL saving images upside-down
保存するときに、上下逆にという対策をしたコードを Github に公開した。
OpenCV
オープンソースのコンピュータビジョン(Computer Vision) のライブラリ
対応している画像ファイルの形式。
パッケージ管理ツールでインストールできる。
MACの例:
brew install opencv
ライセンスは 修正BSD (三条項BSD: 3-clause BSD License)
最新版は 4.2.0(2019年12月)
画像を読み込んで GTK window に表示するコードを Github に公開した。
libpng
PNG形式の画像ファイルの読み書きを行うライブラリ
画像データを圧縮して記録する方式であり、
そのためのエンコードとデコードも行う
パッケージ管理ツールでインストールできる。
MACの例:
brew install libpng
ライセンスは、libpng License
最新版は 1.6.37(2019年4月)
使い方は、FreeImage や Devil に比べると、難しい。
C++ ラッパーが公開されている。
これを使うと、楽になる。
C++ ラッパーを使って、
画像を読み込んで GTK window に表示するコードを Github に公開した。
libjpeg
JPEG 形式の画像ファイルの読み書きを行うライブラリ
画像データを圧縮して記録する方式であり、
そのためのエンコードとデコードも行う
パッケージ管理ツールでインストールできる。
MACの例:
brew install libjpeg
ライセンスは、Libjpeg License
開発元である
Independent JPEG Group を明示すること。
最新版は 9d(2020年1月)
使い方は、FreeImage や Devil に比べると、難しい。
C++ ラッパーが公開されている。
libpng のラッパーに比べると、簡素。
C++ ラッパーを使って、
画像を読み込んで GTK window に表示するコードを Github に公開した。
bmp
Microsoft Windows Bitmap Image
画像ファイルの形式の1つ。
画像ファイルは、
画像の大きさや色数などのヘッダ情報と
非圧縮の画素データから構成される。
ランレングス圧縮(RLE Run Length Encoding)
の場合もある。
- [wikipedia: ランレングス圧縮[(https://ja.wikipedia.org/wiki/%E9%80%A3%E9%95%B7%E5%9C%A7%E7%B8%AE)
ファイル構造が簡単なので、C++ の標準関数で作成することができる
とはいっても、ゼロから作るのは大変。
下記で公開されているコードを試す。
画像を読み込んで GTK window に表示するコードを Github に公開した。
https://github.com/ohwada/MAC_cpp_Samples/tree/master/bmp
このコードは、BMP形式のバリエーションのうち、24ビット非圧縮のみ対応している。
BMP形式のバリエーションについては、下記が詳しい。
tga
Truevision Graphics Adapter
画像ファイルの形式の1つ。
画像ファイルは、
画像の大きさや色数などのヘッダ情報と
非圧縮の画素データから構成される。
ファイル構造が簡単なので、C++ の標準関数で作成することができる
下記で公開されているコードを試す。
- (テクスチャを読み込む)[http://asura.iaigiri.com/OpenGL/gl5.html]
画像を読み込んで GTK window に表示するコードを Github に公開した。
https://github.com/ohwada/MAC_cpp_Samples/tree/master/TGALoader
tga形式にはバリエーションがある。
大きく下記の7通り。
- 0: イメージなし
- 1: インデックスカラー(256色)
- 2: フルカラー 非圧縮
- 3: 白黒
- 9: インデックスカラー。RLE圧縮
- 10: フルカラー RLE圧縮
-11: 白黒。RLE圧縮
今回は、2: フルカラー非圧縮 に対応する。
さらにその中に、色深度と原点位置のバリエーションがある
色深度は、
24ビット(BGR)か
32ビット(BGRA)か
画像の原点が 左下(デフォルト)、左上、 右下、 右上 がある。
RAW image format
RAW画像(RAW image) は、
デジタルカメラの生データを示すことが多いが。
ここでは、画像の大きさや色数などのヘッダ情報がなく、
画素データが RGBA の順番で並んでいる
いわゆるベタ画像のこと。
Gimpで変換できる。
ファイル構造が簡単なので、C++ の標準関数で作成することができる
下記で公開されているコードを試す。
画像を読み込んで GTK window に表示するコードを Github に公開した。
https://github.com/ohwada/MAC_cpp_Samples/tree/master/RawLoader
dds
Direct Draw Surface
画像ファイルの形式の1つ。
下記で公開されているコードを試す。
画像を読み込んで OPenGL window に表示するコードを Github に公開した。
https://github.com/ohwada/MAC_cpp_Samples/tree/master/DDSLoader
dds は、S3TC 圧縮 (S3 Texture Compression) 形式の画素データをそのまま格納する。
このサンプルでは、デコードに OpenGL の glCompressedTexImage2D を使用する。
そのため、OpenGL 環境でしか動作しない。
他の環境で動作させるには、下記の記事のように、
デコーダを自作する。
S3TC 圧縮の仕様を読むと、面倒くさそう。
触らないでおこう。