@sleepool000

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

5色のBMP画像の作成

5色のカラーパレットを使用したBMP画像を作成するプログラムの完成

使用言語:C言語

Macを使用.フォルダからターミナルを起動させて実行

16色bitmap形式を使用 

エラー内容

画像は作成できる
だが,真っ黒になってしまう.(黒のカラーパレットしか使われていないのか?)

該当するソースコード


#include<stdio.h>
#include<stdlib.h>
#define  x 54 //ヘッダ
#define  y 20 //パレット *パレット番号は0~15まで(16色bitmap)
//1つのパレット番号は4bitのデータを参照する
//4bitモード・・・画像データの4bitが1ピクセルに相当する
#define  z 128 //画像データ
unsigned char header[x] ,palet[y] ,data[z];

void bmp_header() {
    printf("16*16dpiのBMP画像の作成(RGB)\n");
    printf("<ヘッダ情報>\n");
    printf("ファイルサイズ[byte]:126\n");
    printf("オフセット[byte]:62\n");
    printf("ヘッダサイズ[byte]:40\n");
    printf("画像の幅[pixel]:16\n");
    printf("画像の高さ[pixel]:16\n");
    printf("色ビット数(1画素におけるビット深度)[bit]:1\n");
    
    printf("圧縮形式:0\n");
    printf("圧縮サイズ[byte]:64\n");
    printf("水平解像度[px/m]:16\n");
    printf("垂直解像度[px/m]:16\n");
    printf("色数\n");
    printf("重要色数\n");
    printf("\n");
    
    //フォーマット種類
    header[0]=0x42;
    header[1]=0x4d;
    //ファイルサイズ
    header[2]=0x7e;
    header[3]=0x00;
    header[4]=0x00;
    header[5]=0x00;
    //予約領域:1
    header[6]=0x00;
    header[7]=0x00;
    //予約領域:2
    header[8]=0x00;
    header[9]=0x00;
    //オフセット:16色bitにすることで値が変化する?
    header[10]=0x3e;
    header[11]=0x00;
    header[12]=0x00;
    header[13]=0x00;
    
    //ヘッダサイズ
    header[14]=0x28;
    header[15]=0x00;
    header[16]=0x00;
    header[17]=0x00;
    //画像の幅
    header[18]=0x10;
    header[19]=0x00;
    header[20]=0x00;
    header[21]=0x00;
    //画像の高さ
    header[22]=0x10;
    header[23]=0x00;
    header[24]=0x00;
    header[25]=0x00;
    //プレーン数
    header[26]=0x01;
    header[27]=0x00;
    //1画素の色数
    header[28]=0x04; //5色の場合:16色bitmap
    header[29]=0x00;
    //圧縮形式
    header[30]=0x00;
    header[31]=0x00;
    header[32]=0x00;
    header[33]=0x00;
    //圧縮サイズ
    header[34]=0x40;
    header[35]=0x00;
    header[36]=0x00;
    header[37]=0x00;
    //水平解像度
    header[38]=0x10;
    header[39]=0x00;
    header[40]=0x00;
    header[41]=0x00;
    //垂直解像度
    header[42]=0x10;
    header[43]=0x00;
    header[44]=0x00;
    header[45]=0x00;
    //色数
//    header[46]=0x00;
    header[46]=0x10; //1画素の色数が4:16色bitmapのとき
    header[47]=0x00;
    header[48]=0x00;
    header[49]=0x00;
    //重要色数
    header[50]=0x00;
    header[51]=0x00;
    header[52]=0x00;
    header[53]=0x00;
    //パレット情報 :番号を追加
    //1つのパレット番号は4bitのデータを参照する
    //1パレットあたり4Byteで表現
    //水色:1
    palet[4]=0xff;
    palet[5]=0xff;
    palet[6]=0x00;
    palet[7]=0x00;

    //ピンク:2
    palet[8]=0xff;
    palet[9]=0x00;
    palet[10]=0xff;
    palet[11]=0x00;

    //赤:3
    palet[12]=0x00;
    palet[13]=0x00;
    palet[14]=0xff;
    palet[15]=0x00;

    //黄:4
    palet[16]=0x00;
    palet[17]=0xff;
    palet[18]=0xff;
    palet[19]=0x00;
    //黒:0
    palet[0]=0x00;
    palet[1]=0x00;
    palet[2]=0x00;
    palet[3]=0x00;
   
    //画像データ
    //0 0 1 0 0 0 0 0  0 0 0 0 0 1 0 0  20 04
    //0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0  00 00
    //1 0 0 0 0 0 2 0  0 2 0 0 0 0 0 1  82 41
    //0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0  00 00
    //1 0 0 0 3 0 3 0  0 3 0 3 0 0 0 B  8a 51
    //0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0  00 00
    //0 0 1 0 2 0 2 0  0 2 0 2 0 1 0 0  2a 54
    //0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0  00 00
    //1 0 0 0 0 0 3 0  0 3 0 0 0 0 0 1  82 41
    //0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0  00 00
    //0 0 1 0 4 0 2 0  0 2 0 4 0 1 0 0  2a 54
    //0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0  00 00
    //1 0 0 0 1 0 0 0  0 0 0 1 0 0 0 1  88 11
    //0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0  00 00
    //1 0 0 0 1 0 0 0  0 0 0 1 0 0 0 1  88 11
    //0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0  00 00
    
    //00 10 00 00  00 00 01 00
    data[120]=0x00;
    data[121]=0x10;
    data[122]=0x00;
    data[123]=0x00;
    data[124]=0x00;
    data[125]=0x00;
    data[126]=0x01;
    data[127]=0x00;
    
    
    
    //00 00 00 00  00 00 00 00
    data[112]=0x00;
    data[113]=0x00;
    data[114]=0x00;
    data[115]=0x00;
    data[116]=0x00;
    data[117]=0x00;
    data[118]=0x00;
    data[119]=0x00;
    
    
    
    //10 00 00 20  02 00 00 01
    data[104]=0x10;
    data[105]=0x00;
    data[106]=0x00;
    data[107]=0x20;
    data[108]=0x02;
    data[109]=0x00;
    data[110]=0x00;
    data[111]=0x01;
    
    //00 00 00 00  00 00 00 00
    data[96]=0x00;
    data[97]=0x00;
    data[98]=0x00;
    data[99]=0x00;
    data[100]=0x00;
    data[101]=0x00;
    data[102]=0x00;
    data[103]=0x00;
    
    //10 00 30 30  03 03 00 01
    data[88]=0x10;
    data[89]=0x00;
    data[90]=0x30;
    data[91]=0x30;
    data[92]=0x03;
    data[93]=0x03;
    data[94]=0x00;
    data[95]=0x01;
    
    
    
    //00 00 00 00  00 00 00 00
    data[80]=0x00;
    data[81]=0x00;
    data[82]=0x00;
    data[83]=0x00;
    data[84]=0x00;
    data[85]=0x00;
    data[86]=0x00;
    data[87]=0x00;
    
    //00 10 20 20  02 02 01 00
    data[72]=0x00;
    data[73]=0x10;
    data[74]=0x20;
    data[75]=0x20;
    data[76]=0x02;
    data[77]=0x02;
    data[78]=0x01;
    data[79]=0x00;
   
    //00 00 00 00  00 00 00 00
    data[64]=0x00;
    data[65]=0x00;
    data[66]=0x00;
    data[67]=0x00;
    data[68]=0x00;
    data[69]=0x00;
    data[70]=0x00;
    data[71]=0x00;

    //10 00 00 30  03 00 00 01
    data[56]=0x10;
    data[57]=0x00;
    data[58]=0x00;
    data[59]=0x30;
    data[60]=0x03;
    data[61]=0x00;
    data[62]=0x00;
    data[63]=0x01;
    
    //00 00 00 00  00 00 00 00
    data[48]=0x00;
    data[49]=0x00;
    data[50]=0x00;
    data[51]=0x00;
    data[52]=0x00;
    data[53]=0x00;
    data[54]=0x00;
    data[55]=0x00;
    
    //00 10 40 20  02 04 01 00
    data[40]=0x00;
    data[41]=0x10;
    data[42]=0x40;
    data[43]=0x20;
    data[44]=0x02;
    data[45]=0x04;
    data[46]=0x01;
    data[47]=0x00;
    
    //00 00 00 00  00 00 00 00
    data[32]=0x00;
    data[33]=0x00;
    data[34]=0x00;
    data[35]=0x00;
    data[36]=0x2a;
    data[37]=0x54;
    data[38]=0x00;
    data[39]=0x00;
    
    //10 00 10 00  00 01 00 01
    data[24]=0x10;
    data[25]=0x00;
    data[26]=0x10;
    data[27]=0x00;
    data[28]=0x00;
    data[29]=0x01;
    data[30]=0x00;
    data[31]=0x01;
    
    //00 00 00 00  00 00 00 00
    data[16]=0x00;
    data[17]=0x00;
    data[18]=0x00;
    data[19]=0x00;
    data[20]=0x00;
    data[21]=0x00;
    data[22]=0x00;
    data[23]=0x00;
    
    //10 00 10 00  00 01 00 01
    data[8]=0x10;
    data[9]=0x00;
    data[10]=0x10;
    data[11]=0x00;
    data[12]=0x00;
    data[13]=0x01;
    data[14]=0x00;
    data[15]=0x01;
    
    
   
    //00 00 00 00  00 00 00 00
    data[0]=0x00;
    data[1]=0x00;
    data[2]=0x00;
    data[3]=0x00;
    data[4]=0x00;
    data[5]=0x00;
    data[6]=0x00;
    data[7]=0x00;
    
    
    
}
void bmp_make() {
    FILE*fp;
    fp=fopen("decide up!!.bmp" ,"wb");
    if(fp==NULL){
        printf("ファイルを開けません\n");
        exit(0);
                    }
    fwrite(header ,4 ,54 ,fp); //1は1pxのこと?
    fwrite(palet ,4,20 ,fp);
    fwrite(data,4 ,128 ,fp);
    fclose(fp);
}
int main(void){
    bmp_header();
    bmp_make();
    printf("正常にファイルが作成されました ファイル名:decide up!!.bmp\n");
    return 0;
}

蜘蛛を模したイラストのBMP画像が完成する
2022-07-28 9.50のイメージ.jpg

自分で試したこと

パレット番号を画像データにそれぞれ当てた
画像データの数を増やした
1画素における色数が4bitになるようにした

わからないこと

オフセットがどう変わるのか

0 likes

1Answer

ちらっと見た感じ、ヘッダのオフセット4バイトを0x3E 00 00 00としているようですが、16色(4bitColor)BMPの場合はここは0x76 00 00 00ですね。

0Like

Comments

  1. > fwrite(palet ,4,20 ,fp);

    ここもおかしいですね。
    パレット1色分4バイトが5色分で20バイト書き込んだのかもしれませんが、実際に5色しか使わなくても16色モードなら16色分の64バイト確保する必要があります。

Your answer might help someone💌