今日は画像処理

アバター
パコネコ
記事: 139
登録日時: 14年前
住所: 大阪

今日は画像処理

投稿記事 by パコネコ » 14年前

前々からやりたかった画像処理がようやくできました。
bmpを読み取ってピクセル単位で描写するのに一晩かかりました。

これでようやくbmpデータを書きかえられるようになります。
まだスタディc用ですが・・・

CODE:

#include
#include
int main(void){
	FILE *fp;
	int a,b,c,d;
	int i;
	int mapx,mapy;
	int x,y;
	fp=fopen("C:\\~省略~\\参考資料2\\dog2.bmp","rb");
//ファイルヘッダ
	//ファイルの種類(BM)
	for(i=0;i<2;i++){
		//fscanf(fp,"%c ",&a);
		a=getc(fp);
		printf("%c",a);
	}
	printf("\n");
	//ファイルサイズ
	a=getc(fp);
	b=getc(fp);
	c=getc(fp);
	d=getc(fp);
	printf("ファイルサイズ\t0x%02x%02x%02x%02x\t%ldバイト\n",d,c,b,a,d*256*256*256+c*256*256+b*256+a);

	//予約領域(0らしい・・・)
	for(i=1;i<=2;i++){
		a=getc(fp);
		b=getc(fp);
		printf("予約領域%d\t0x%x%x\n",i,b,a);
	}

	//画像データまでのオフセット(意味不明)
	a=getc(fp);
	b=getc(fp);
	c=getc(fp);
	d=getc(fp);
	printf("画像データまでのオフセット\t%ld\n",d*256*256*256+c*256*256+b*256+a);

//情報ヘッダ
	//情報ヘッダのサイズ
	a=getc(fp);
	b=getc(fp);
	c=getc(fp);
	d=getc(fp);
	printf("情報ヘッダのサイズ\t%ld\n",d*256*256*256+c*256*256+b*256+a);

	//画像の高さ
	a=getc(fp);
	b=getc(fp);
	c=getc(fp);
	d=getc(fp);
	printf("画像の縦幅\t%ldピクセル\n",mapx=d*256*256*256+c*256*256+b*256+a);

	//画像の幅
	a=getc(fp);
	b=getc(fp);
	c=getc(fp);
	d=getc(fp);
	printf("画像の横幅\t%ldピクセル\n",mapy=d*256*256*256+c*256*256+b*256+a);

	//プレーン数(常に1)<-不明
	a=getc(fp);
	b=getc(fp);
	printf("プレーン数\t%d\n",b*256+a);

	//1画素当たりの色数
	a=getc(fp);
	b=getc(fp);
	printf("1画素当たりの色数\t%dビット\n",b*256+a);

	//圧縮形式
	a=getc(fp);
	b=getc(fp);
	c=getc(fp);
	d=getc(fp);
	printf("圧縮形式?\t%ld\n",d*256*256*256+c*256*256+b*256+a);

	//画像データのサイズ
	a=getc(fp);
	b=getc(fp);
	c=getc(fp);
	d=getc(fp);
	printf("画像データのサイズ\t%ldバイト\n",d*256*256*256+c*256*256+b*256+a);

	//水平解像度
	a=getc(fp);
	b=getc(fp);
	c=getc(fp);
	d=getc(fp);
	printf("水平解像度\t%ldppg\n",d*256*256*256+c*256*256+b*256+a);

	//垂直解像度
	a=getc(fp);
	b=getc(fp);
	c=getc(fp);
	d=getc(fp);
	printf("垂直解像度\t%ldppg\n",d*256*256*256+c*256*256+b*256+a);

	//パレットの色数
	a=getc(fp);
	b=getc(fp);
	c=getc(fp);
	d=getc(fp);
	printf("パレットの色数\t\t\t%ld\n",d*256*256*256+c*256*256+b*256+a);

	//重要パレットのインデックス
	a=getc(fp);
	b=getc(fp);
	c=getc(fp);
	d=getc(fp);
	printf("重要パレットのインデックス\t%ld\n",d*256*256*256+c*256*256+b*256+a);

//データ部
	//ウィンドウの作成
	gl_openwin(-1,-1,mapx,mapy,1);
	for(y=mapy;0<y;y--){
		for(x=0;x<mapx;x++){
			//色
			a=getc(fp);
			b=getc(fp);
			c=getc(fp);
			//点の描写
			gl_setpixel(x,y,RGB(c,b,a));
		}
		//ずれの修正
		for(i=0;i<mapx%4;i++)
			getc(fp);
	}

	fclose(fp);
}
今日はこの報告だけです。
(うれしかったので。)
最近日記書いてなかったですし・・・
最後に編集したユーザー パコネコ on 2010年12月12日(日) 06:38 [ 編集 1 回目 ]

アバター
へろりくしょん
記事: 92
登録日時: 14年前

Re: 今日は画像処理

投稿記事 by へろりくしょん » 14年前

ざらっとしか見てませんが、なんだかすごい苦労が忍ばれるコードですね。 スタディCを知らないのですが、構造体は使えないのでしょうか。

それはそうと、このコードだと24bitカラーの画像しか読み込めないのではないですか?
24bitカラー以外の画像を読み込んだ場合、終了する。 ようにした方が良いのではないかと。

喜びに水を差すようなコメントになってしまいました。 すみません。

せっかくですから、あらゆる内容の画像をネコミミ化出来るようにすれば素敵だと思います。

dic
記事: 658
登録日時: 14年前

Re: 今日は画像処理

投稿記事 by dic » 14年前

私も水をさすようで申し訳ないですが
Windows環境だったら BITMAPINFO 構造体などが用意されています
スタディCというからもっぱら学習用ってところでしょうね
ビットマップってWindows用でしたっけ?Linux,UNIXでは標準サポートしてるのかな・・・?

どちらにせよ、ゆっくりしていってね!

アバター
パコネコ
記事: 139
登録日時: 14年前
住所: 大阪

Re: 今日は画像処理

投稿記事 by パコネコ » 14年前

コメントありがとです。
>>へろりさん
構造体は普通に使えますよ。
ただ単に私が、構造体をあまり使わないので。
もちろん目的があれば使いますが、今回はあるサイトを見ながらうえから順番に、書いてった感じなので、
全体を把握してなかったんです。
24bit限定ってばれましたかww
「1画素あたりの・・・」を保存しておけば他のでもできそうですね。
後で実装しておきます。
そしてネコミミ化、いいですね~
画像事態にネコミミなら簡単なのに・・・
(もともと上から準備しておいた画像を重ねるように作ったものですが・・・)
アドバイスありがとうございました。

>>dicさん
画像のパフパフ笑ってしまいました。
もともとスタディCにも描写用の関数あるんですけどね。
描写はできるけど書き込みなどの方法がなかったためとりあえず内容を覚えようかと・・・
個人的にビットマップ使うこと多いので、ビットマップで勉強しましたが、他のものもやってみますね。

はい。ゆっくりしていきます。
(あ、死亡フラグが・・・)

====追伸====
スタディCが悪い子ということではなく、
C言語では描写関数が標準でないためスタディC用のものを使ったためそのように書いたまでです。
ウィンドウズの描写の部分と、点の描写の部分(gl_と書いてる関数)
がスタディC用のためもし起動してみようというつわものがいたときのために書いておきました。
最後に編集したユーザー パコネコ on 2010年12月14日(火) 01:02 [ 編集 1 回目 ]