はじめに
C++の標準関数だけでビットマップを作成します。
グレースケール専用です。
サンプルコード
bmp.hpp
#include <fstream>
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned int DWORD;
#pragma pack(1)
typedef struct {
WORD Type;
DWORD Size;
WORD Reserved1;
WORD Reserved2;
DWORD OffBits;
} BitMapFileHeader_t;
typedef struct {
DWORD Size;
DWORD Width;
DWORD Height;
WORD Planes;
WORD BitCount;
DWORD Compression;
DWORD SizeImage;
DWORD XPixPerMeter;
DWORD YPixPerMeter;
DWORD ClrUsed;
DWORD ClrImportant;
} BitMapInfoHeader_t;
typedef struct {
BYTE Blue;
BYTE Green;
BYTE Red;
BYTE Reserved;
} BitMapRGB_t;
typedef struct {
BitMapFileHeader_t File;
BitMapInfoHeader_t Info;
BitMapRGB_t RGB[256];
} BitMap_t;
#pragma pack()
void save(unsigned char *img, char *filename, int width, int height){
FILE *fp;
BitMap_t bitmap;
bitmap.File.Type = 19778;
bitmap.File.Size = 14 + 40 + 1024 + width*height;
bitmap.File.Reserved1 = 0;
bitmap.File.Reserved2 = 0;
bitmap.File.OffBits = 14 + 40 + 1024;
bitmap.Info.Size = 40;
bitmap.Info.Width = width;
bitmap.Info.Height = height;
bitmap.Info.Planes = 1;
bitmap.Info.BitCount = 8;
bitmap.Info.Compression = 0;
bitmap.Info.SizeImage = 0;
bitmap.Info.XPixPerMeter = 0;
bitmap.Info.YPixPerMeter = 0;
bitmap.Info.ClrUsed = 0;
bitmap.Info.ClrImportant = 0;
for (int i = 0; i < 256; i++) {
bitmap.RGB[i].Blue = i;
bitmap.RGB[i].Green = i;
bitmap.RGB[i].Red = i;
bitmap.RGB[i].Reserved = 0;
}
fp = fopen(filename, "wb");
fwrite(&bitmap, sizeof(bitmap), 1, fp);
fwrite(img, sizeof(*img)*width*height, 1, fp);
fclose(fp);
};
bmp.cpp
#include <stdlib.h>
#include "bmp.hpp"
int main(){
int width = 8;
int height = 8;
unsigned char *img;
img = (unsigned char*)malloc(width*height*sizeof(unsigned char));
for (int i = 0; i < width * height; i++)
img[i] = i;
save(img, "output.bmp", width, height);
return 0;
}
使い方
bmp.hppがカレントディレクトリにある状態でbmp.cppをコンパイルして実行すると
output.bmpが作成されます。
g++ bmp.cpp
./a.out
# output.bmpが作成される
解説
bmp.hppではビットマップのヘッダの構造体と画像を保存する関数を定義しています。
画像を保存するsave()関数の引数は以下です。
save(<1byteの画素値>, <保存するファイル名>, <画像の横幅>, <画像の縦幅>)
まとめ
C++の標準関数だけでビットマップを作成しました。
コメント