C言語を用いたビットマップ画像の扱いについて。
学校課題でビットマップファイルを読み取り、指定ピクセルのパラメータを調べるというものがありました。
fseekで指定ピクセルの場所まで飛べばいいとわかるのですがfseekや16進数の扱いがよくわかりません。パディングの考慮などで10進数のバイトを計算しどれだけ先へ飛ぶかをfseekに与えたいのですが、これは16進数に変換して渡さないといけないのでしょうかそれとも16進と10進混合で渡していいのでしょうか(0xfffff+1024みたいな形)?またパディング(pad)のバイト数の計算は合っているでしょうか?
加えて、ピクセルのデータを格納する配列用意し、初期化したのですが、(short lbなど)正常に結果が表示されないことがありました。(メモリに不要なデータが入っている?)どうすればよいでしょうか?
言葉で伝えるのが難しいため作成中のプログラムを以下に載せます。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
FILE *fp;
int t=0;
int x,y,ofset,pad=0;
short pb;
short lb[3],lt[3],rt[3],rb[3];
char data[16];
for(t=0;t<3;t++){
lb[t]=0;
lt[t]=0;
rb[t]=0;
rt[t]=0;
}
printf("file name:");
scanf("%s",data);
if((fp=fopen(data,"rb+"))==NULL){
printf("File not found.\n");
return 0;
}
fseek(fp,0x0012,SEEK_SET); fread(&x,4,1,fp);/横のピクセル数 fread(&y,4,1,fp);縦のピクセル数 fseek(fp,0x001c,SEEK_SET); fread(&pb,2,1,fp); printf("Horizontal size=%d Vertical size=%d,\n",x,y); printf("Bit length per pixel=%d\n",pb); fseek(fp,0x000a,SEEK_SET); fread(&ofset,4,1,fp); printf("offset:%d\n",ofset); if(x*pb/8%4!=0){ pad=4-x*pb/8%4; } int l=(x*pb+pad)/8; fseek(fp,ofset/8,SEEK_SET); fread(lb,1,3,fp); fseek(fp,ofset/8+l-pb/3,SEEK_SET); fread(rb,1,3,fp); fseek(fp,ofset/8+l*(y-1),SEEK_SET); fread(lt,1,3,fp); fseek(fp,ofset/8+l*(y-1)+l-pb/3,SEEK_SET); fread(rt,1,3,fp); printf("left top(R=%d,B=%d,G=%d) ",lt[2],lt[1],lt[0]); printf("right top(R=%d,B=%d,G=%d)\n",rt[2],rt[1],rt[0]); printf("left bottom(R=%d,B=%d,G=%d) ",lb[2],lb[1],lb[0]); printf("right bottom(R=%d,B=%d,G=%d)\n",rb[2],rb[1],rb[0]); fclose(fp); return 0;
}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。