BMPファイルへの書き込みができない
このプログラムは、左半分を黒、右半分を白の画像をBMPファイルに出力しようとしています。(出来ていません)
プログラムの下に質問書いてます!お願いします!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct{
char *filename;
int x;
int y;
int width;
int height;
unsigned char data[80][100];
} BMP_DATA;
static void WriteBmp(char *filename, BMP_DATA Image)
{
unsigned long Bmp_size;/*BMPファイルのサイズ*/
unsigned int Bmp_info_header_size;/*情報ヘッダのサイズ*/
unsigned int Bmp_header_size;/*ヘッダのサイズ*/
long Bmp_width;/*幅*/
long Bmp_height;/*高さ*/
unsigned short Bmp_planes;/*プレーン数*/
unsigned short Bmp_color;/*色 = 1[bit] (黒か白かだけ)*/
long Bmp_image_size;/*画像部分のサイズ*/
long Bmp_xppm;/*水平解像度*/
long Bmp_yppm;/*垂直解像度*/
int i,j;
unsigned char Bmp_headbuf[54]; /*ヘッダ*/
unsigned char Bmp_Data[13];
FILE *Out = fopen(filename, "wb");
if(Out==NULL){
fclose(Out);
exit(1);
}
/* ヘッダ情報の準備 */
Bmp_info_header_size = 40;
Bmp_header_size = 54;
Bmp_planes = 1;
Bmp_color = 1;
Bmp_image_size = Image.height * Image.width;
Bmp_xppm = 0;
Bmp_yppm = 0;
Bmp_size = Bmp_image_size + Bmp_header_size;
Bmp_headbuf[0] = 'B';
Bmp_headbuf[1] = 'M';
memcpy(Bmp_headbuf+2, &Bmp_size, sizeof(Bmp_size));
Bmp_headbuf[6] = 0;
Bmp_headbuf[7] = 0;
Bmp_headbuf[8] = 0;
Bmp_headbuf[9] = 0;
memcpy(Bmp_headbuf+10, &Bmp_header_size, sizeof(Bmp_header_size));
Bmp_headbuf[11] = 0;
Bmp_headbuf[12] = 0;
Bmp_headbuf[13] = 0;
memcpy(Bmp_headbuf+14, &Bmp_info_header_size, sizeof(Bmp_info_header_size));
Bmp_headbuf[15] = 0;
Bmp_headbuf[16] = 0;
Bmp_headbuf[17] = 0;
memcpy(Bmp_headbuf+18, &Image.width, sizeof(Bmp_width));
memcpy(Bmp_headbuf+22, &Image.height, sizeof(Bmp_height));
memcpy(Bmp_headbuf+26, &Bmp_planes, sizeof(Bmp_planes));
memcpy(Bmp_headbuf+28, &Bmp_color, sizeof(Bmp_color));
memcpy(Bmp_headbuf+34, &Bmp_image_size, sizeof(Bmp_image_size));
memcpy(Bmp_headbuf+38, &Bmp_xppm, sizeof(Bmp_xppm));
memcpy(Bmp_headbuf+42, &Bmp_yppm, sizeof(Bmp_yppm));
Bmp_headbuf[46] = 0;
Bmp_headbuf[47] = 0;
Bmp_headbuf[48] = 0;
Bmp_headbuf[49] = 0;
Bmp_headbuf[50] = 0;
Bmp_headbuf[51] = 0;
Bmp_headbuf[52] = 0;
Bmp_headbuf[53] = 0;
/* ヘッダ情報書き出し */
fwrite(Bmp_headbuf, sizeof(unsigned char), Bmp_header_size, Out);
/* 画像データ書き出し */
for(i=0;i<13;i++) Bmp_Data[i] = 0;
for(i=0; i<Image.height; i++){
for(j=0; j<Image.width; j++){
int index = j/8;
if(j%8 == 0){
Bmp_Data[index] = Image.data[i][j ] * 128 +
Image.data[i][j+1] * 64 +
Image.data[i][j+2] * 32 +
Image.data[i][j+3] * 16 +
Image.data[i][j+4] * 8 +
Image.data[i][j+5] * 4 +
Image.data[i][j+6] * 2 +
Image.data[i][j+7];
}
}
Bmp_Data[12] = (Bmp_Data[12] & 0xf0);
fwrite(Bmp_Data, sizeof(unsigned char), 20, Out); /* ○ */
}
fclose(Out);
}
int main()
{
BMP_DATA Image;
int line = 0;
int i,j;
Image.x = 0;
Image.y = 0;
Image.width = 100;
Image.height = 80;
if(line == 0){
for(i=0; i<Image.height; i++){
for(j=0; j<Image.width; j++){
Image.data[i][j] = 1;
}
}
}
while(1){
/* BMPファイルデータを編集 */
for(j=0; j<Image.width; j++){
if(j < 50){
Image.data[line][j] = 0;//black
}else{
Image.data[line][j] = 1;//white
}
}
/* すべての列を編集したら、再描画する */
if(line == 63){
/* BMPファイルに書込む */
WriteBmp("display.bmp", Image);
break;
}
line++;
}
return 0;
}
以下の条件で、BMPファイルへ書き込もうとしています
・色の深さ1(黒か白)
・画像のピクセルサイズ(横100×縦80)
fwrite関数で1列ずつ書き込もうとしているのですが、
この関数は1バイトずつしか書き込めないみたいで、100ビット書き込もうと思うと、
最低でも104ビット書き込まなくてはならない状況になります。
まず、この4ビットはどう処理すればいいのでしょうか??
あと、display.bmpのファイルがある状態で、プログラムを実行するとちゃんと動くのですが、
プログラム中の○のところのfwrite関数の第三引数を13にすると、BMPファイルが壊れて閲覧できなくなります。(ある程度大きい数字だと、BMPファイルは壊れないのですが、ぐちゃぐちゃの絵になります)
その理由もわかりません。
汚い文章&プログラムですが
よろしくお願いします><
お礼
ありがとうございました。無事変換できました。 今更、というわけでもないのですが、うっすらとコマンドプロンプトとかを使うのではないかとは思ってはいました。 しかし、いかんせんプログラムはdelphiを少しかじった程度で、そっち方面にはまったく明るくないと言っても過言ではないため、今回の質問に至りました。 コマンドを教えて頂き、大変助かりました。コマンドプロンプトを使うというだけでは、初心者にはどんなコマンドを入れればいいのかチンプンカンプンなので、やはり変換などもっと勉強したいと思います。