2016-03-12 138 views
-1

我想在C中創建一個位圖灰度圖像。如果我將它設置爲24 => 3字節它的作品,但給我彩色圖像問題是每像素位。我想設置它8 => 1個字節,所以它產生灰度圖像。位圖8位灰度圖像在C

#include<stdio.h> 
main() { 
    char bitmap[1000]; 
    FILE *bp; 

    // -- FILE HEADER -- // 

    // bitmap signature 
    bitmap[0] = 0x42; // B 
    bitmap[1] = 0x4d; // M 

    // file size 
    bitmap[2] = 0x86; // 40 + 14 + 12 (134-66) = 68 
    bitmap[3] = 0; 
    bitmap[4] = 0; 
    bitmap[5] = 0; 

    // reserved field (in hex. 00 00 00 00) 
    for (int i = 6; i < 10; i++) bitmap[i] = 0; 

    bitmap[10] = 54; // 54-36 

    // offset of pixel data inside the image 
    for (int i = 11; i < 14; i++) bitmap[i] = 0; 

    // -- BITMAP HEADER -- // 

    // header size 
    bitmap[14] = 0x28; // 40 
    for (int i = 15; i < 18; i++) bitmap[i] = 0; 

    // width of the image 
    bitmap[18] = 4; // 5 
    for (int i = 19; i < 22; i++) bitmap[i] = 0; 

    // height of the image 
    bitmap[22] = 1; // 5 
    for (int i = 23; i < 26; i++) bitmap[i] = 0; 

    // reserved field 
    bitmap[26] = 1; 
    bitmap[27] = 0; 

    // number of bits per pixel 
    bitmap[28] = 24; // 3 byte 24 
    bitmap[29] = 0; 

    // compression method (no compression here) 
    for (int i = 30; i < 34; i++) bitmap[i] = 0; 

    // size of pixel data 
    bitmap[34] = 24; // 12 bits => 4 pixels 80 
    bitmap[35] = 0; 
    bitmap[36] = 0; 
    bitmap[37] = 0; 

    // horizontal resolution of the image - pixels per meter (2835) 
    bitmap[38] = 0; 
    bitmap[39] = 0; 
    bitmap[40] = 0xC4; //48 
    bitmap[41] = 0x0E; //177 

    // vertical resolution of the image - pixels per meter (2835) 
    bitmap[42] = 0; 
    bitmap[43] = 0; 
    bitmap[44] = 0xC4; 
    bitmap[45] = 0x0E; 

    // color pallette information 
    for (int i = 46; i < 48; i++) bitmap[i] = 0; 

    // color pallette information 
    for (int i = 48; i < 50; i++) bitmap[i] = 0; 

    // number of important colors 
    for (int i = 50; i < 52; i++) bitmap[i] = 0; 

    // number of important colors 
    for (int i = 52; i < 54; i++) bitmap[i] = 0; 

    // -- PIXEL DATA -- // 
    for (int i = 54; i < 134; i++){ 
    if (i %2 == 0) 
     bitmap[i] = 0xFF; 
    else bitmap[i] = 0; 
    } 
    /*bitmap[54] =1; bitmap[55] = 1; bitmap[56] = 0; 
    bitmap[57] = 1; bitmap[58] = 1; bitmap[59] = 0; 
    bitmap[60] = 1; bitmap[61] = 1; bitmap[62] = 0; 
    bitmap[63] = 1; bitmap[64] = 1; bitmap[65] = 0;*/ 

    bp = fopen("e://binary.bmp", "wb"); 
    for (int i = 0; i < 134; i++) { 
     fprintf(bp, "%c", bitmap[i]); 
    } 
    fclose(bp); 

} 
+0

你真的很難編碼這個。正常的方法是填充BITMAPINFO結構並將其寫入一次。 –

+0

只是使所有的顏色(rgb)相同... –

+0

另一件事我該如何增加圖像的高度和寬度!如果我將寬度從4更改爲其他數字,圖像與高度不一樣! – ahsanic

回答

0

設置BitsPerPixel = 8,讓標題之後是256個RGBQUAD條目,定義一個灰色斜坡。

+0

當我將bitsperpixel設置爲8時,它不起作用!此代碼顯示顏色位圖。所以不知何故它bitperpixel = 8作品,我想我們不需要添加256種顏色。 – ahsanic

+0

@ahsanic設置BitsPerPixel = 8,讓標題後跟256個RGBQUAD條目,定義一個灰色斜坡。 –

+0

如何在表後添加256個rgbquad條目? – ahsanic