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

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

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

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

解決済

BMPファイルを書き込む際にデータが欠損してしまう

Takayou
Takayou

総合スコア15

C

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

2回答

0リアクション

0クリップ

814閲覧

投稿2019/09/28 01:15

編集2019/09/28 02:06

c言語でBMP画像の入出力を実装したいのですがうまくいきません。

具体的には、読み込んだBMPファイルをそのまま出力しようとしたところ、出力したファイルを開くと
「このファイルはサポートしていない形式のようです」
となり、画像が表示されません。

また、入力ファイルのサイズにくらべて出力ファイルのサイズが小さくなってしまっています。
(入力ファイル4144kBに対して、出力ファイル4142KB)

以下にプログラムを示します。
どなたか教えてください!

追記
visual studio2019で動かしています。
また、画像は以下のリンクのものをしようしています。
https://www.google.com/url?sa=i&source=images&cd=&ved=2ahUKEwjG5LHctfLkAhXC62EKHWyLBJ0QjRx6BAgBEAQ&url=http%3A%2F%2Fimagingsolution.blog.fc2.com%2Fblog-entry-180.html&psig=AOvVaw0T4Qw7OXJeYByGbmMmddTJ&ust=1569722386315809

C

/* BMPファイルに対して, 以下の処理を行う ・グレースケール変換 ・エッジ検出(Prewittオペレータ, Sobelオペレータ) ・拡大,縮小,回転, 移動(線形補間法) */ #include<stdio.h> #include<stdlib.h> #define IMG_MAX_SIZE 512 typedef struct { unsigned char *red; unsigned char *blue; unsigned char *green; }ImageData; typedef struct { unsigned char FileHeader[14]; unsigned int Size; int Width, Height; unsigned char InfoHeader[28]; ImageData img; }BMP; //BMPファイル読み込み void ReadBmp(char FileName[], BMP* bmp); //画像を書き込む void WriteBmp(char FileName[], BMP* bmp); int main() { BMP bmp; char input_file[] = "lena.bmp"; char output_file[] = "lenaout.bmp"; ReadBmp(input_file, &bmp); WriteBmp(output_file, &bmp); return 0; free(bmp.img.red); free(bmp.img.green); free(bmp.img.blue); } //BMPファイル読み込み void ReadBmp(char FileName[], BMP* bmp) { FILE* fp; fopen_s(&fp, FileName, "rb"); if (fp == NULL) { printf("Not Found : %s", FileName); exit(1); } //ヘッダー情報を読み込み fread(bmp->FileHeader, sizeof(unsigned char), 14, fp); fread(&bmp->Size, sizeof(int), 1, fp); fread(&bmp->Width, sizeof(int), 1, fp); fread(&bmp->Height, sizeof(int), 1, fp); fread(bmp->InfoHeader, sizeof(unsigned char), 28, fp); //画像本体の読み込み bmp->img.red = (unsigned char*)malloc( (bmp->Width) * (bmp->Height) * sizeof(unsigned char)); bmp->img.blue = (unsigned char*)malloc( (bmp->Width) * (bmp->Height) * sizeof(unsigned char)); bmp->img.green = (unsigned char*)malloc( (bmp->Width) * (bmp->Height) * sizeof(unsigned char)); if (bmp->img.red == NULL) { printf("メモリ確保に失敗\n"); exit(1); } if (bmp->img.green == NULL) { printf("メモリ確保に失敗\n"); exit(1); } if (bmp->img.blue == NULL) { printf("メモリ確保に失敗\n"); exit(1); } for (int h = 0; h < bmp->Height; h++) { for (int w = 0; w < bmp->Width; w++) { fread(&bmp->img.red [w + h * bmp->Width], sizeof(unsigned char), 1, fp); fread(&bmp->img.green [w + h * bmp->Width], sizeof(unsigned char), 1, fp); fread(&bmp->img.blue [w + h * bmp->Width], sizeof(unsigned char), 1, fp); } } //読みこんだファイルを閉じる fclose(fp); } //画像を書き込む void WriteBmp(char FileName[], BMP* bmp) { FILE* fp; fopen_s(&fp, FileName, "wb"); if (fp == NULL) { printf("Not Found : %s\n", FileName); exit(1); } fwrite(bmp->FileHeader, sizeof(unsigned char), 14, fp); fwrite(&bmp->Size, sizeof(int), 1, fp); fwrite(&bmp->Width, sizeof(int), 1, fp); fwrite(&bmp->Height, sizeof(int), 1, fp); fwrite(bmp->InfoHeader, sizeof(unsigned char), 28, fp); printf("%s\n", bmp->FileHeader); printf("%d %d %d\n", bmp->Size, bmp->Width, bmp->Height); printf("%s\n", bmp->InfoHeader); //画像本体の読み込み for (int h = 0; h < bmp->Height; h++) { for (int w = 0; w < bmp->Width; w++) { fwrite(&bmp->img.red [w + h * bmp->Width], sizeof(unsigned char), 1, fp); fwrite(&bmp->img.green[w + h * bmp->Width], sizeof(unsigned char), 1, fp); fwrite(&bmp->img.blue [w + h * bmp->Width], sizeof(unsigned char), 1, fp); } } fclose(fp); }

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

dodox86

2019/09/28 01:40

回答未満なのでこちらにコメントさせてもらいますが、何か色々と問題がありそうな気がします。Windowsのビットマップファイルって、単純なフォーマットではないです。また、構造体メンバーのパディングの問題で、正しくメンバーが読めていない気もします。ファイルのヘッダーは確かに14バイト(sizeof(BITMAPFILEHEADER))ですが、32ビット境界ではないのでコンパイル結果によっては以降にズレが生じます。そんなこんなで、ファイルの読み取り時点でおかしくなっているのでは。有名なレナさん画像"lena.bmp"をお使いでしょうから、ファイルの在処(ダウンロード元?)やコンパイルオプションを示せば、有効な回答を得られるかもしれません。
Takayou

2019/09/28 01:52

ありがとうございます、修正させていただきます。
Zuishin

2019/09/28 02:09

BMP ではないようですが。
dodox86

2019/09/28 02:21

>Zuishinさん 本当だ、PNGファイルですね。 >Takayouさん 画像の見た目のお話ではありません。もし本当にここからレナさん画像PNGファイルをダウンロードしたのであれば、ファイルのフォーマットが違うので、絶対に扱えません。それとも、これからBMPファイルに手動で変換したのでしょうか。
Takayou

2019/09/28 03:35

ここから手動でBMPファイルに変換してしまいました。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C

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