LoginSignup
7

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-03-28

概要

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

free_image_logo.jpg

汎用的な画像ライブラリ

対応している画像ファイルの形式。
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 ユーザーは要注意です。
赤と青が入れ替わるというバグがある。

Red/Blue channels swapped

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

PDF: FreeImage 3.17.0 documentation

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

Devil

devil_logo.jpg

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

opencv_logo.png

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

対応している画像ファイルの形式。
- 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 に公開した。

libpng

libpng_logo.png

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

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

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

ライセンスは、libpng License

最新版は 1.6.37(2019年4月)

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

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

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

libjpeg

libjpeg_logo.png

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)
の場合もある。

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

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

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

Bitmapファイルを入出力してみる

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

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

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

tga

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

wikipedia: TGA

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

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

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

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

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

TGA (Targa) 形式

大きく下記の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で変換できる。
- GIMP - GNU Image Manipulation Program

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

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

テクスチャを読み込む

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

dds

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

wikipedia: DirectDraw Surface

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

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

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

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

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

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

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

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
7