やあ子供たち、元気にしてたかい?本当に作ろうとしてたものではなくて、何となくツールとか使ってるうちに出来てきちゃってそれが結構よく見えてきちゃったからこれが私の作品です、私の絵ですモデルですプログラムですって出しちゃうのってさ、それぁ君たちねぇ、違うだろプロとしては。とおじさんは最近いつも思っているよ。何でもそうだよね、何でもそう。
今日はフツーのBMP画像をお手軽にメモリバッファに読み込むためのソースを紹介するぞ。以下のコードをコピペするだけだ。ファイルパスを第一引数にして呼び出してくれ。残りの引数は皆出力引数で、画像サイズ、画像のデプス(1ピクセルあたりのバイト数)、そして画像情報だ。とても手軽で簡単だね。
ただし汎用ではないから注意が必要だ。画像サイズが4の倍数でない場合、1ピクセル列(横方向並び)の終わりは、何が何でも4ピクセルの倍数で列が終わるように、いちいち0で埋めてくるぞ。てなわけでBMPの画像フォーマットに詳しくない人は、画像の幅のピクセル数が4の倍数の場合に限って使ってくれよな。
#include <windows.h> static void read_bmp( const char* filename, int* lwidth, // 画像の幅(4の倍数) int* lheight, // 画像の高さ int* lpixel_depth, // 1ピクセルあたりの情報3(RGB)か4(RGBA) unsigned char** lbuf //BGRBGR..並びの画像データ (上記=3の場合) ) { // Simple BMP Reader (C) 2008 nurs // int& width = *lwidth; int& height = *lheight; int& pixel_depth = *lpixel_depth; unsigned char*& buf = *lbuf; const int offbits = 54; BITMAPFILEHEADER file_header; BITMAPINFOHEADER info_header; FILE* fp = fopen( filename, "rb" ); fread( &file_header, sizeof( BITMAPFILEHEADER ), 1, fp ); fread( &info_header, sizeof( BITMAPINFOHEADER ), 1, fp ); { pixel_depth = info_header.biBitCount/8; width = info_header.biWidth; height = info_header.biHeight; } int raster_sec_bytes = pixel_depth * width * height; buf = new unsigned char[ raster_sec_bytes ]; fread( buf, sizeof( unsigned char ), raster_sec_bytes, fp ); fclose( fp ); return; }
ちなみにメモリバッファにあるイメージをBMPファイルとして書き出すコードはこっちで紹介しているから興味のある人は見てみてくれ。