【C++】 画像ファイルを読み込む簡単な方法
はじめに
C++で画像ファイルを読み込む方法はいくつかあります。本記事では、以下の方法を紹介します。
- OpenCVを使う方法
- stb_image.hを使う方法
- fstreamを使ってBMP画像を読み込む方法
OpenCVを使った画像の読み込み
OpenCVは強力な画像処理ライブラリで、多くのフォーマットの画像を簡単に読み込むことができます。
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
cv::Mat image = cv::imread("image.jpg");
if (image.empty()) {
std::cerr << "画像を読み込めませんでした。" << std::endl;
return -1;
}
cv::imshow("表示", image);
cv::waitKey(0);
return 0;
}
このコードはOpenCVを使って画像を読み込み、表示します。
stb_image.hを使った画像の読み込み
stb_image.hはシンプルな画像読み込み用のヘッダファイルです。
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
#include <iostream>
int main() {
int width, height, channels;
unsigned char* img = stbi_load("image.png", &width, &height, &channels, 0);
if (!img) {
std::cerr << "画像を読み込めませんでした。" << std::endl;
return -1;
}
std::cout << "幅: " << width << " 高さ: " << height << " チャンネル: " << channels << std::endl;
stbi_image_free(img);
return 0;
}
この方法は単純で依存関係が少なく、軽量です。
fstreamを使ったBMP画像の読み込み
BMPフォーマットはヘッダ情報がシンプルなので、fstreamを使って直接読み込むことができます。
#include <fstream>
#include <iostream>
#include <vector>
#pragma pack(1)
struct BMPHeader {
char signature[2];
int fileSize;
int reserved;
int dataOffset;
};
struct DIBHeader {
int headerSize;
int width;
int height;
short planes;
short bitsPerPixel;
int compression;
int imageSize;
int xPixelsPerMeter;
int yPixelsPerMeter;
int colorsUsed;
int importantColors;
};
int main() {
std::ifstream file("image.bmp", std::ios::binary);
if (!file) {
std::cerr << "ファイルを開けませんでした。" << std::endl;
return -1;
}
BMPHeader bmpHeader;
DIBHeader dibHeader;
file.read(reinterpret_cast(&bmpHeader), sizeof(bmpHeader));
file.read(reinterpret_cast(&dibHeader), sizeof(dibHeader));
std::cout << "BMP画像の幅: " << dibHeader.width << " 高さ: " << dibHeader.height << std::endl;
file.close();
return 0;
}
このコードはBMP画像のヘッダ情報を解析して、画像の幅と高さを取得します。
まとめ
本記事では、C++で画像を読み込む方法として、以下の3つを紹介しました。
- OpenCVを使う(高機能で多機能)
- stb_image.hを使う(シンプルで軽量)
- fstreamを使う(BMPフォーマットに限定されるが、仕組みを理解しやすい)
用途に応じて適切な方法を選択してください。