ビットマップ画像を読み込むプログラムがうまく行きません。困ってます…。
こんにちは。大学4年のyu-tinと申します。
現在、大学の研究で使用するためのプログラムとして、以下の機能を持ったプログラム作りに取り込んでいます。
1)ビットマップ画像(グレースケール、縦480×横640pixel)を読み込み、
その画像の1つ1つの画素の輝度値を表示させる
2)読み込んだビットマップ画像を出力させる
しかし、作成したプログラムがうまく行きません。以下の3つの問題が発生しています。
a)0行0列~1行383列までの画素値がおかしい。
(0,0,0,0,1,1,1,0,2,2,2,0,3,3,3,0,…,254,0,255,255,255,0 となっている)
b)出力した画像の最上部2行程度に、細くて黒い線が表示される。
(読み込んだ画像と全く同じ画像を出力させたい)
c)出力した画像が、”ディスクエラー”によりPhotoshopで開けない。
(ペイントでは開ける)
その問題のプログラムは、以下の通りです。
しかし、このプログラムは、他人のプログラムに改良を加えて作成したものです。なので、このプログラム自体、私自身が完璧に理解できていない状況です。
私は、プログラミングに関しては初心者に近いので、丁寧に教えて頂けると大変助かります。
研究が先に進まず、大変困っています…。みなさま、本当に、本当によろしくお願い致します。
//ビットマップ画像に関するプログラム。
//画像の表示と輝度値の表示を行う。
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#define X_SIZE 640 //画像の横幅(ピクセル数)
#define Y_SIZE 480 //画像の縦幅(ピクセル数)
#define Z_SIZE 1 //1つの画素に含まれる色の数
void *malloc(size_t size);
void main(void)
{
int i, j, k; //ループ用変数 i…縦の画素用, j…横の画素用, k…色数用
int x=0; //画像の横幅(ピクセル数)*/
int y=0; //画像の縦幅(ピクセル数)
FILE *fp;
/***********元画像データのメモリ確保*********/
BYTE ***mae;
mae=(BYTE ***)malloc(sizeof(BYTE **)*Y_SIZE);
for(i = 0; i < Y_SIZE; i++){
mae[i]=(BYTE **)malloc(sizeof(BYTE *)*X_SIZE);
}
for(i = 0; i < Y_SIZE; i++){
for(j = 0; j < X_SIZE; j++){
mae[i][j]=(BYTE *)malloc(sizeof(BYTE)*Z_SIZE);
}
}
/*******画像の読み込み・輝度値の表示*******/
fp=fopen("sample1.bmp","rb"); //画像”sample1”を開く
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
fread(&bmfh,sizeof(bmfh),1,fp);
fread(&bmih,sizeof(bmih),1,fp);
x=bmih.biWidth; //インフォヘッダに含まれる画像の幅情報をxに代入
y=bmih.biHeight; //インフォヘッダに含まれる画像の高さ情報をyに代入
for(i = 0; i < y ;i++){
for(j = 0; j < x; j++){
fread(&mae[i][j][0],sizeof(BYTE),1,fp);
if(i<640 && j<480)printf("%d, %d, %d\n",i, j, mae[i][j][0]); //輝度値を表示
}
}
fclose(fp);
/**************画像の表示*************/
//画像”sample1”を”sample2”という名前で出力する
fp = fopen("sample2.bmp" ,"wb");
//ヘッダの書き込み
fwrite(&bmfh,sizeof(bmfh),1,fp);
fwrite(&bmih,sizeof(bmih),1,fp);
for(i = 0; i < bmih.biHeight; i++){
for(j = 0; j < bmih.biWidth; j++){
fwrite(&mae[i][j][0],sizeof(BYTE),1,fp);
}
}
fclose(fp); //ファイルをクローズ
}
お礼
本当にありがとうございました。