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ファイルは壊れないのですが、ぐちゃぐちゃの絵になります)
その理由もわかりません。
汚い文章&プログラムですが
よろしくお願いします><
補足
ありがとうございます。 動きましたが、やはり32ビットでした。 ペイントで開いて24ビットで保存しても、32ビットのままだし。 フリーソフトで24ビット保存すると、真っ黒になるし。 bmpをウェーブレット変換して、透かし文字を入れて、元に戻すという作業をやっています。単に画像を開いて、保存するだけだと、ImageFormat.BMPでも24ビットでした。透かしを入れると32ビットになるのですが、単にRGB値を変更してるだけなので、ビット数は変わりませんよね。