2016-03-12 8 views
-1

Я пытаюсь создать растровое изображение в оттенках серого в C. Проблема заключается в битах на пиксель, если я устанавливаю его на 24 => 3 байта, но он дает мне цветное изображение. Я хочу установить 8 => 1 байт, чтобы он получал полутоновое изображение.Bitmap 8bit Grayscale Image In 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

Когда я устанавливаю битперпикселя на 8, он не работает! Этот код показывает цветное растровое изображение. Так почему-то это bitperpixel = 8 работает, я думаю, нам не нужно добавлять 256 цветов. – ahsanic

+0

@ahsanic Set BitsPerPixel = 8, а за заголовком должны следовать 256 записей RGBQUAD, определяющих серый рамп. –

+0

Как добавить 256 записей rgbquad после таблицы? – ahsanic