C/C++ にて　画像ファイルを読み込む

### 概要

C/C++ にて　画像ファイルを読み込む方法をまとめた。

画像ファイルを読み込んで、GTK window または
 OpenGL window に表示する。
 

- 方法１
FreeImage や Devil などの汎用的な画像ライブラリを使用する

- 方法２
OpenCV など画像読み込み機能を持つライブラリを使用する

- 方法３
 linjpeg　や　libpng など特定の画像形式の画像ライブラリを使用する

- 方法４
ライブラリを使用せず、自作する
bmp や tga などのファイル構造が簡単で非圧縮の画像形式は、C++ の標準関数で作成することができる。

MAC にて動作確認したコードを Github に公開した。
https://github.com/ohwada/MAC_cpp_Samples/blob/master/ImageLoader.md

### FreeImage
![free_image_logo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/89c15592-8e5a-ad26-c716-fa07ee78038f.jpeg)

汎用的な画像ライブラリ

http://freeimage.sourceforge.net/

対応している画像ファイルの形式。
http://freeimage.sourceforge.net/features.html

パッケージ管理ツールでインストールできる。
MACの例：
brew install freeimage

ライセンスは　GNUとのFIPLの２本立て
- 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 ユーザーは要注意です。
赤と青が入れ替わるというバグがある。

[Red/Blue channels swapped](https://sourceforge.net/p/freeimage/bugs/117/)

内部の FIBITMAP 形式は、上下逆の座標です。

[PDF: FreeImage 3.17.0 documentation](http://mirrors.dotsrc.org/pub/exherbo/FreeImage3170.pdf)
 


読み込んだあと、赤と青が入れ替えるという対策をしたコードを Github　に公開した。
https://github.com/ohwada/MAC_cpp_Samples/tree/master/FreeImage

### Devil
![devil_logo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/a97a5bd1-84fe-be62-0288-56959e58419c.jpeg)

Developer's Image Library
汎用的な画像ライブラリ

- http://openil.sourceforge.net/  


対応している画像ファイルの形式。
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](https://www.gamedev.net/forums/topic/467011-devil-saving-images-upside-down/)

保存するときに、上下逆にという対策をしたコードを Github　に公開した。

https://github.com/ohwada/MAC_cpp_Samples/tree/master/Devil


### OpenCV
![opencv_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/fef881f3-6507-b68d-1865-48a6139f722d.png)

オープンソースのコンピュータビジョン(Computer Vision) のライブラリ

- https://opencv.org/

対応している画像ファイルの形式。
- https://amin-ahmadi.com/2016/09/24/list-of-image-formats-supported-by-opencv/

パッケージ管理ツールでインストールできる。
MACの例：
brew install opencv


ライセンスは　修正BSD (三条項BSD: 3-clause BSD License)

 最新版は 4.2.0(2019年12月)



画像を読み込んで GTK window に表示するコードを Github に公開した。

https://github.com/ohwada/MAC_cpp_Samples/tree/master/OpenCV-ImageReadWrite


### libpng
![libpng_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/0858c5c4-3e9a-d993-1cd5-f23119720c14.png)

PNG形式の画像ファイルの読み書きを行うライブラリ

画像データを圧縮して記録する方式であり、
そのためのエンコードとデコードも行う


http://www.libpng.org/pub/png/libpng.html

パッケージ管理ツールでインストールできる。
MACの例：
brew install libpng


ライセンスは、[libpng License](http://libpng.org/pub/png/src/libpng-LICENSE.txt)

 最新版は 1.6.37(2019年4月)

使い方は、FreeImage や Devil に比べると、難しい。

- [libpngのインストールとC言語での使用方法・使用例](https://daeudaeu.com/programming/c-language/libpng/)

- [libpngライブラリを使ってみた](https://fa11enprince.hatenablog.com/entry/2014/01/04/162203)

C++ ラッパーが公開されている。
これを使うと、楽になる。

https://www.nongnu.org/pngpp/

C++ ラッパーを使って、
画像を読み込んで GTK window に表示するコードを Github に公開した。


### libjpeg
![libjpeg_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/04b3d07f-fbd9-890d-3e3d-505264246cb6.png)

JPEG 形式の画像ファイルの読み書きを行うライブラリ

画像データを圧縮して記録する方式であり、
そのためのエンコードとデコードも行う

http://libjpeg.sourceforge.net/

パッケージ管理ツールでインストールできる。
MACの例：
brew install libjpeg


ライセンスは、[Libjpeg License](https://jpegclub.org/reference/libjpeg-license/)

開発元である
	[Independent JPEG Group](http://www.ijg.org/) を明示すること。


 最新版は 9d(2020年1月)

使い方は、FreeImage や Devil に比べると、難しい。


C++ ラッパーが公開されている。
libpng のラッパーに比べると、簡素。

- [github; libjpeg_cpp](https://github.com/md81544/libjpeg_cpp)


C++ ラッパーを使って、
画像を読み込んで GTK window に表示するコードを Github に公開した。


### bmp

Microsoft Windows Bitmap Image
画像ファイルの形式の１つ。

画像ファイルは、
画像の大きさや色数などのヘッダ情報と
非圧縮の画素データから構成される。

ランレングス圧縮(RLE　Run Length Encoding)
の場合もある。

- [wikipedia: ランレングス圧縮[(https://ja.wikipedia.org/wiki/%E9%80%A3%E9%95%B7%E5%9C%A7%E7%B8%AE)

ファイル構造が簡単なので、C++ の標準関数で作成することができる

とはいっても、ゼロから作るのは大変。

下記で公開されているコードを試す。

[Bitmapファイルを入出力してみる](http://hooktail.org/computer/index.php?Bitmap%A5%D5%A5%A1%A5%A4%A5%EB%A4%F2%C6%FE%BD%D0%CE%CF%A4%B7%A4%C6%A4%DF%A4%EB)

画像を読み込んで GTK window に表示するコードを Github に公開した。
https://github.com/ohwada/MAC_cpp_Samples/tree/master/bmp
![screenshot_door.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/067d4d57-608d-29bd-7b01-f396bc85a363.png)




このコードは、BMP形式のバリエーションのうち、２４ビット非圧縮のみ対応している。

BMP形式のバリエーションについては、下記が詳しい。

- [BMP画像の読み込み](https://www.mm2d.net/main/prog/c/image_io-12.html)


### tga

Truevision Graphics Adapter
画像ファイルの形式の１つ。

[wikipedia: TGA](https://ja.wikipedia.org/wiki/TGA)

画像ファイルは、
画像の大きさや色数などのヘッダ情報と
非圧縮の画素データから構成される。

ファイル構造が簡単なので、C++ の標準関数で作成することができる



下記で公開されているコードを試す。

- (テクスチャを読み込む)[http://asura.iaigiri.com/OpenGL/gl5.html]


画像を読み込んで GTK window に表示するコードを Github に公開した。
https://github.com/ohwada/MAC_cpp_Samples/tree/master/TGALoader



tga形式にはバリエーションがある。

[TGA (Targa) 形式](http://www.openspc2.org/format/TGA/index.html)

大きく下記の７通り。

- 0:	イメージなし
- 1:	インデックスカラー（256色）
- 2:	フルカラー 非圧縮
- 3:	白黒
- 9:	インデックスカラー。RLE圧縮
- 10:	フルカラー RLE圧縮
-11:	白黒。RLE圧縮

今回は、2: フルカラー非圧縮 に対応する。

さらにその中に、色深度と原点位置のバリエーションがある

色深度は、
２４ビット（BGR）か
３２ビット（BGRA）か


画像の原点が 左下（デフォルト）、左上、 右下、　右上 がある。


### RAW image format

RAW画像(RAW image) は、
デジタルカメラの生データを示すことが多いが。

ここでは、画像の大きさや色数などのヘッダ情報がなく、
画素データが　RGBA　の順番で並んでいる
いわゆるベタ画像のこと。

- [wikipedia: RAW画像](https://ja.wikipedia.org/wiki/RAW%E7%94%BB%E5%83%8F)

- [wikipedia: ベタ画像](https://ja.wikipedia.org/wiki/%E3%83%99%E3%82%BF%E7%94%BB%E5%83%8F)

Gimpで変換できる。
- [GIMP - GNU Image Manipulation Program](https://www.gimp.org/)



ファイル構造が簡単なので、C++ の標準関数で作成することができる

下記で公開されているコードを試す。

[テクスチャを読み込む](http://asura.iaigiri.com/OpenGL/gl4.html)

画像を読み込んで GTK window に表示するコードを Github に公開した。
https://github.com/ohwada/MAC_cpp_Samples/tree/master/RawLoader


### dds

Direct Draw Surface
画像ファイルの形式の１つ。

[wikipedia: DirectDraw Surface](https://ja.wikipedia.org/wiki/DirectDraw_Surface)

下記で公開されているコードを試す。

- [テクスチャを読み込む](http://asura.iaigiri.com/OpenGL/gl7.html)


画像を読み込んで OPenGL window に表示するコードを Github に公開した。
https://github.com/ohwada/MAC_cpp_Samples/tree/master/DDSLoader

dds は、S3TC 圧縮 (S3 Texture Compression) 形式の画素データをそのまま格納する。

- [wikipedia: DXTC](https://ja.wikipedia.org/wiki/DXTC)

このサンプルでは、デコードに OpenGL  の glCompressedTexImage2D を使用する。

- [khronos: glCompressedTexImage2D](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glCompressedTexImage2D.xhtml)

そのため、OpenGL 環境でしか動作しない。

他の環境で動作させるには、下記の記事のように、
デコーダを自作する。

- [DDSファイルを自力で読んでみよう](http://techblog.sega.jp/entry/2016/12/26/100000)

S3TC 圧縮の仕様を読むと、面倒くさそう。
触らないでおこう。

- [TEXTURE COMPRESSION TECHNIQUES](http://sv-journal.org/2014-1/06/en/index.php?lang=en#5-1)