質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

772閲覧

c言語を用いたビットマップの読み取りについて

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/07/23 15:17

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;

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

パディングの考慮などで10進数のバイトを計算しどれだけ先へ飛ぶかをfseekに与えたいのですが、これは16進数に変換して渡さないといけないのでしょうかそれとも16進と10進混合で渡していいのでしょうか(0xfffff+1024みたいな形)?

「16進数」とか「10進数」とか言ってもそれはソースコード上だけの話で、実際の機械語ではすべて等しく2進数として処理されます。0xfffff+1024と計算しても特に問題ありません。

投稿2018/07/23 22:24

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

回答ではないですが、

こういうデータを読み込む場合には、
ある程度の大きさのバッファを用意しておいて、それにファイルを読み込み、そのバッファに対してパラメータの読み出しを行うようにします。

んで、データ構造とかみたいなら、バイナリエディタというツールがあるので、それでファイルを読み込めば、ファイル内容が見れるようになるのでそれでチェックしてみてはどうでしょうか。

投稿2018/07/24 00:02

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問