2017-10-20 108 views
1

編譯我決定學習C,我儘量按照這個教程http://ricardolovelace.com/creating-bitmap-images-with-c-on-windows.html如何在C創建位圖,並用gcc

,但是當我嘗試編譯我的代碼用gcc,因爲這> GCC -Wall TESTCØ應用

他不知道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',考慮使結構聲明一正確的typedef。 – orhtej2

+0

當你說'> gcc -Wall testc o app',你是不是指'> gcc -Wall test.c -o app'?如果是這樣,那麼你運行該應用程序爲'。/ app'。 –

+0

C沒有'new'。我認爲你在混合一點C++。 –

回答

0

位圖文件格式比較複雜。這不是學習C的最好方式。最好從簡單的事情開始。

話雖如此,位圖格式以一個長度爲14個字節的位圖標題BITMAPFILEHEADER結構開始,其後是BITMAPINFOHEADER結構,長度爲40個字節。這些結構定義在"Windows.h"

你必須寫入這些結構中的各種信息,並在寫入實際像素之前將它們寫入文件。

您可以擁有1,4,8,16,24和32位位圖。這是讀取32位位圖的示例。此代碼假定sizeof(short)是2,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; 
} 

注意第一像素爲藍色,其次是綠色和閱讀。最後一個像素不用於32位位圖。高度也從下到上。這是位圖的另一個奇特功能。 24位位圖更復雜,因爲它們需要填充。 8位和更低將需要一個額外的調色板。

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

float不是像素的正確類型。每種顏色從0到255.這適合於unsigned char。您需要改爲

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

該alpha是32位位圖(我們不會使用)的額外字節。注意這個結構的大小爲4,您可以分配以此爲

struct rgb_data *rgb = malloc(size); 

現在,您可以訪問像素如下:

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

根據網站規則,圖書推薦偏離主題。你說你想學習C,而不是Web開發。位圖格式和C語言很少用於Web開發。 –