投稿者 tel | 2010年8月16日

画像処理プログラミング – Bitmapの保存

Bitmapファイルの保存について書いてなかったので今回は保存について。といっても読み込みができさえすればとくに難しいところはなし。以下コード。

inline void WriteLine24(const RGB *src, FILE *fp, int length)
{
  for(int i = 0; i < length; i++) {
  unsigned char buf[3] = {
    src->b,
    src->g,
    src->r
  };
  fwrite(buf, 3, 1, fp);
  src++;
  }
}

int SaveBitmap(const char *fileName, const Image24 *src)
{
	int i, j, p, linemod, linebyte;
	BitmapFileHeader head;
	BitmapInfoHeader info;
	FILE *fp;

	if(src == NULL || src->lines == NULL) {
		printf("%s save failed!\n", fileName);
		return 0;
	}

	linemod = src->width * 3 % 4;

	if(linemod == 0)
		linebyte = src->width * 3;
	else
		linebyte = src->width * 3 + (4 - linemod);

	// write bitmap file header
	head.bfType = 'B' | 'M' << 8; 	head.bfSize = sizeof(BitmapFileHeader) + sizeof(BitmapInfoHeader) + linebyte * src->height;
	head.bfReserved1 = 0;
	head.bfReserved2 = 0;
	head.bfOffBits = sizeof(BitmapFileHeader) + sizeof(BitmapInfoHeader);

	// write bitmap info header
	info.biSize = sizeof(BitmapInfoHeader);
	info.biWidth = src->width;
	info.biHeight = src->height;
	info.biPlanes = 1;
	info.biBitCount = 24;
	info.biCompression = 0;
	info.biSizeImage = linebyte * src->height;
	info.biXPelsPerMeter = 0;
	info.biYPelsPerMeter = 0;
	info.biClrUsed = 0;
	info.biClrImportant= 0;

	fopen_s(&fp, fileName, "wb");

	if(fileName == NULL || fp == NULL) return 0;

	// write header
	fwrite(&head, sizeof(BitmapFileHeader), 1, fp);
	fwrite(&info, sizeof(BitmapInfoHeader), 1, fp);

	const int padding = 0;

	// write data
	p = 0;
	for(i = 0; i < src->height; i++) {
		WriteLine24(src->lines[info.biHeight - i - 1], fp, info.biWidth);
		// 4byteの境界にあわせて0を書き込む
		if(linemod != 0) fwrite(&padding, 4 - linemod, 1, fp);
	}

	fclose(fp);
	return 1;
}

ヘッダの内容については意外と適当なので注意。幅と高さとビットカウントあたりをちゃんと入れて置けばプレビューできると思う。WriteLine24を別関数にしているのは、あとでいろんな形式に対応できたらいいなーとか目論んでいるから。


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

カテゴリー

%d人のブロガーが「いいね」をつけました。