2016-03-12 2 views
-1

J'essaye de créer une image en niveaux de gris bitmap en C. Le problème est des bits par pixel si je l'ai mis à 24 => 3 octets cela fonctionne mais donne l'image en couleur. Je veux le définir 8 => 1 octet pour qu'il produise une image en niveaux de gris.Bitmap image en niveaux de gris 8bit En 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

Vous codez vraiment cela à la dure. La méthode normale consiste à remplir une structure BITMAPINFO et à l'écrire en une seule fois. –

+0

juste faire toutes les couleurs (RVB) la même chose ... –

+0

Une autre chose comment puis-je augmenter la hauteur et la largeur de l'image! Si je change la largeur de 4 à n'importe quelle autre image de nombre ne fonctionne pas même avec la taille! – ahsanic

Répondre

0

Définissez BitsPerPixel = 8 et laissez l'en-tête être suivi de 256 entrées RGBQUAD définissant une rampe grise.

+0

Quand je mets bitspixel à 8 ça ne marche pas! Ce code montre le bitmap de couleur. Donc en quelque sorte il bitpixel = 8 fonctionne je suppose que nous n'avons pas besoin d'ajouter 256 couleurs. – ahsanic

+0

@ahsanic Définissez BitsPerPixel = 8 et laissez l'en-tête être suivi de 256 entrées RGBQUAD définissant une rampe grise. –

+0

comment ajouter 256 entrées rgbquad après la table? – ahsanic