掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
単色のビットマップファイルを16色に変更するためには (ID:69442)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
今回の場合、まず BMP の仕様を理解しない事には前に進めないと思う。 それ無くして、回答者の人達が呉れている情報を理解する事はかなり困難。 ↓に(一般的形式の)2色DIB を 16色DIB に変換する処理を載せる。 BMP の仕様と睨めっこして、何をやっているか処理を追いかけてみると良いかと。 そうこうしている内に多分解ってくる。 void* cnv_2to16(void* src) { BITMAPINFOHEADER *src_bih, *dst_bih; RGBQUAD *src_pal, *dst_pal; char *src_bits, *dst_bits; int src_rowbyte, dst_rowbyte; void *dst; int pal, x, y, src_pos, dst_pos; src_bih = (BITMAPINFOHEADER*)src; assert(src_bih->biBitCount == 1); src_rowbyte = ((1 * src_bih->biWidth + 31) / 32) * 4; dst_rowbyte = ((4 * src_bih->biWidth + 31) / 32) * 4; dst = malloc(sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 16 + dst_rowbyte * src_bih->biHeight); if (dst == NULL) { return NULL; } dst_bih = (BITMAPINFOHEADER*)dst; memcpy(dst_bih, src_bih, sizeof(BITMAPINFOHEADER)); dst_bih->biSize = sizeof(BITMAPINFOHEADER); dst_bih->biBitCount = 4; dst_bih->biSizeImage = dst_bih->biClrUsed = dst_bih->biClrImportant = 0; src_pal = (RGBQUAD*)((char*)src_bih + src_bih->biSize); dst_pal = (RGBQUAD*)((char*)dst_bih + dst_bih->biSize); for (pal=0; pal < 2; ++pal) { dst_pal[pal] = src_pal[pal]; } for (; pal < 16; ++pal) { /* palette の空き領域に適当な色をセット */ } src_bits = (char*)src_pal + sizeof(RGBQUAD) * 2; dst_bits = (char*)dst_pal + sizeof(RGBQUAD) * 16; memset(dst_bits, 0, dst_rowbyte * src_bih->biHeight); for (y=0; y < dst_bih->biHeight; ++y) { for (x=0; x < dst_bih->biWidth; ++x) { src_pos = src_rowbyte * y + (x / 8); dst_pos = dst_rowbyte * y + (x / 2); dst_bits[dst_pos] |= ((src_bits[src_pos] >> (7 - (x % 8))) & 0x01) << (4 * (1 - (x % 2))); } } return dst; } BITMAPINFOHEADER http://msdn.microsoft.com/ja-jp/library/cc352308.aspx RGBQUAD http://msdn.microsoft.com/ja-jp/library/ms532316(en-us).aspx
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.