2017-10-20 12 views
1

でコンパイルする私はCを学ぶことを決めた、と私は、このチュートリアルhttp://ricardolovelace.com/creating-bitmap-images-with-c-on-windows.htmlはどのようにC言語でビットマップを作成し、gccの

に従うことを試みるだけに、私はこの> gccの-Wall TESTC Oアプリとしてgccで自分のコードをコンパイルしようとすると、

彼はtype_rgbを知らないのですが、このタイプはどのように定義できますか?私のコードのどこに?

#include <stdio.h> 


struct rgb_data { 
    float r, g, b; 
}; 

void save_bitmap(const char *file_name, int width, int height, int dpi, type_rgb *pixel_data); 
/* 
next steps of the tutorial 
*/ 

rgb_data *pixels = new rgb_data[width * height]; 

for(int x = 0; x < width; x++) 
    { 
    for(int y = 0; y < height; y++) 
     int a = y * width +x; 
      { 

      if ((x > 50 && x < 350) && (y > y && y < 350)) 
       { 
       pixels[a].r = 255; 
       pixels[a].g = 255; 
       pixels[a].b = 0; 
       }else{ 
       pixels[a].r = 55; 
       pixels[a].g = 55; 
       pixels[a].b = 55; 
       } 

    } 
} 

save_bitmap("black_border.bmp", width, height, dpi, pixels); 
+0

をあなたのタイプは、 '構造体rgb_data'で、構造体宣言aを作る考えてみます。この構造体のサイズは、あなたは次のように今、あなたはピクセルにアクセスすることができます

struct rgb_data *rgb = malloc(size); 

としてこれを割り当てることができます。4.で注意してください適切なtypedef。 – orhtej2

+0

'> gcc -Wall testc o app'と言うと、'> gcc -Wall test.c -o app'を意味しませんか?もしそうなら、アプリケーションを '。/ app'として実行します。 –

+0

Cに 'new'がありません。私は少しC++で混合していると思います。 –

答えて

0

ビットマップファイル形式はかなり複雑です。これはC言語を学ぶ最善の方法ではありません。はるかに簡単なものから始める方が良いでしょう。

ビットマップフォーマットはビットマップヘッダBITMAPFILEHEADERで始まり、14バイト長で始まり、次にBITMAPINFOHEADER構造40バイト長が続きます。これらの構造は、"Windows.h"

で定義されています。実際のピクセルを書き込む前に、これらの構造にさまざまな情報を書き込んでファイルに書き込む必要があります。

1,4,8,16,24,32ビットのビットマップを持つことができます。これは、32ビットのビットマップを読み取る例です。このコードは、sizeof(int) 4.

int main() 
{ 
    int row, column; 
    int width = 100; 
    int height = 100; 
    int size = width * height * 4; //for 32-bit bitmap only 

    char header[54] = { 0 }; 
    strcpy(header, "BM"); 
    memset(&header[2], (int)(54 + size), 1); 
    memset(&header[10], (int)54, 1);//always 54 
    memset(&header[14], (int)40, 1);//always 40 
    memset(&header[18], (int)width, 1); 
    memset(&header[22], (int)height, 1); 
    memset(&header[26], (short)1, 1); 
    memset(&header[28], (short)32, 1);//32bit 
    memset(&header[34], (int)size, 1);//pixel size 

    unsigned char *pixels = malloc(size); 
    for(row = height - 1; row >= 0; row--) { 
     for(column = 0; column < width; column++) { 
      int p = (row * width + column) * 4; 
      pixels[p + 0] = 64; //blue 
      pixels[p + 1] = 128;//green 
      pixels[p + 2] = 192;//red 
     } 
    } 

    FILE *fout = fopen("32bit.bmp", "wb"); 
    fwrite(header, 1, 54, fout); 
    fwrite(pixels, 1, size, fout); 
    free(pixels); 
    fclose(fout); 
    return 0; 
} 

なお、第1のピクセルが緑色及び読み出しに続いて、青色であり、2 sizeof(short)となります。最後のピクセルは32ビットのビットマップでは使用されません。また、高さは下から上に向かいます。これはビットマップの別の奇妙な特徴です。 24ビットのビットマップは、パディングが必要なため、より複雑です。 8ビット以下では追加のパレットが必要です。

floatは、ピクセルに適していません。各色は0から255になります。これはunsigned charに収まります。代わりに必要です

struct rgb_data { 
    unsigned r, g, b, alpha; 
}; 

アルファは32ビットビットマップ(これは使用しません)の余分なバイトです。

int p = (row * width + column); 
rgb[p].r = 255; 
rgb[p].g = 0; 
rgb[p].b = 0; 
... 
fwrite(rgb, 4, width * height, fout); 
+0

大丈夫、ありがとう!私はyoruのスクリプトをテストします。私はPHP/javascript/html/cssから来て、どのように私は従うべきですかバイナリ画像とそのフォーマットを構築する方法を理解したいと思いますか?本/ウェブサイト? –

+0

書籍の推奨事項は、ウェブサイトのルールに従って話題になっていません。あなたは、Web開発ではなく、Cを学びたかったと言いました。ビットマップ形式とC言語は、Web開発ではほとんど使用されません。 –

関連する問題