ページ 11

Bitmapファイルの読み込み

Posted: 2009年2月03日(火) 19:51
by たか
今、256色Bitmapファイルを文字列に変換して表示するプログラムを作っています。
Bitmapファイルをエラーチェックしながら用意した各構造体に格納するまでは出来ました。

困っているのは画像データ部分の表示です。
画像データの読み込みまでは何とかなったのですが、表示処理部分が出来ませんでした。

表示処理部分ができないのは、画像データの反転処理が思いつかなかったからです。
一晩考えていろいろ試してみましたが全然だめでした。

とりあえず画像ファイルを元にパレット番号を表示する部分まで作りました。
その先の反転処理を教えてください。よろしくお願いします。
//引数:Bitmapファイル画像データ部分へのポインタ 幅 4byte境界に合わせた幅 高さ
//戻り値:---
//画像データを文字列に変換して表示
void DrawBmpString(BYTE *ImageData, LONG Width, LONG LWidth, LONG Height){
	int i, j;
	BYTE *buf;

	buf = (BYTE*)malloc( sizeof(BYTE) * (LWidth * Height) );
	
	//何らかの処理

	
	//表示処理部分
	for(i = 0; i < Height; i++){
		for(j = 0; j < Width; j++){
			printf("%-3d ", (int)buf[j + i * Width]);
		}
		printf("\n");
	}

	free(buf);
}
一応全てのソースファイルを固めて添付しました。

環境:
Visual C++ 2008 Express
Windows Vista Home Basic

Re:Bitmapファイルの読み込み

Posted: 2009年2月03日(火) 20:59
by toyo
buf = (*BYTE)malloc( sizeof(BYTE) * (LWidth * Height) );

buf = (BYTE*)malloc( sizeof(BYTE) * (LWidth * Height) );

printf("%-3d ", (int)buf[j + i * Width]);

printf("%-3d ", (int)ImageData[j + i * LWidth]);
では
反転というのはBMPが下から上になっているのを上から下に表示したいということでしょうか
それなら
for(i = 0; i < Height; i++){

for(i = Height - 1; i >= 0 ; i--){
ですが

Re:Bitmapファイルの読み込み

Posted: 2009年2月03日(火) 23:18
by たか
toyoさん

>buf = (BYTE*)malloc( ...
私の単純なミスでした。修正しました。
固めたファイルの方は修正してません・・・。

>printf("%-3d", (int)buf[ ...
これは用意したbufに画像データをコピーしてそれを表示する。
という方法を取る予定でしたので、こうしました。
説明不足でしたすみません。

>反転というのは ...
私が言う反転というのは、Bitmapファイルの画像データ部分の仕様のことで、

<元データ>
00011000
00100100
00100100
00100100
01000010
01111110
01000010
10000000

<画像データ>
10000001
01000010
01111110
01000010
00100100
00100100
00100100
00011000

こういうことです。

>for(i = Height - 1; i >= 0 ; i--){
やってみましたが、正しく表示できませんでした。
他のプログラムが間違っているのでしょうか。

Re:Bitmapファイルの読み込み

Posted: 2009年2月03日(火) 23:45
by たか
よく考え直してみると、表示処理に問題がありますね。
その証拠に幅が4の倍数だと正常に表示されます。

事故解決しそうですが・・・。
一歩先に進めそうにないです。

Re:Bitmapファイルの読み込み

Posted: 2009年2月03日(火) 23:57
by たか
事故解決しました。
printf("%-3d ", (int)buf[j + i * Width]);
printf("%-3d ", (int)buf[j + i * LWidth]);
自分の中ではWidth→LWidthに修正していた思っていたのですが・・・。
toyoさんありがとうございました。