2017-10-20 14 views
1

i décidé d'apprendre C, et j'essaie de suivre ce tutoriel http://ricardolovelace.com/creating-bitmap-images-with-c-on-windows.htmlcomment créer bitmap en C et compilez avec gcc

mais quand je tente de compiler mon code avec gcc comme cela> gcc -Wall TestC app o

il ne connaît pas type_rgb, puis-je définir ce type et comment? et où dans mon code?

#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

Votre type est 'struct rgb_data', faire la déclaration struct une typedef approprié. – orhtej2

+0

Quand vous dites '' gcc -Wall testc o app'', ne voulez-vous pas dire '' gcc -Wall test.c -o app''? Si c'est le cas, lancez l'application en tant que './App'. –

+0

C n'a pas 'new'. Je pense que vous mélangez un peu de C++. –

Répondre

0

Le format de fichier bitmap est plutôt compliqué. Ce n'est pas la meilleure façon d'apprendre C. Il vaut mieux commencer par quelque chose de beaucoup plus simple. Cela dit, le format bitmap commence par une structure bitmap BITMAPFILEHEADER de 14 octets de long, suivie de BITMAPINFOHEADER structure de 40 octets. Ces structures sont définies dans "Windows.h"

Vous devez écrire diverses informations dans ces structures et les écrire dans un fichier avant d'écrire les pixels réels.

Vous pouvez avoir un bitmap 1, 4, 8, 16, 24 et 32 ​​bits. Ceci est un exemple pour lire un bitmap 32 bits. Ce code suppose sizeof(short) est 2, sizeof(int) est 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; 
} 

Notez le premier pixel est bleu, suivi du vert et lire. Le dernier pixel n'est pas utilisé dans le bitmap 32 bits. Aussi la hauteur va de bas en haut. Ceci est une autre caractéristique étrange de bitmap. Les bitmaps 24 bits sont plus compliqués car ils nécessitent un remplissage. 8 bits et moins auront besoin d'une palette supplémentaire.

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

float n'est pas le bon type de pixels. Chaque couleur va de 0 à 255. Cela correspond à unsigned char. Vous avez besoin au lieu

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

L'alpha est l'octet supplémentaire pour bitmap 32 bits (que nous n'utiliserons pas). Notez la taille de cette structure est 4. Vous pouvez attribuer cela comme

struct rgb_data *rgb = malloc(size); 

Maintenant, vous pouvez accéder aux pixels comme suit:

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

d'accord, merci! Je vais tester le script yoru. Je viens de php/javascript/html/css et je voudrais comprendre comment construire des images binaires et leurs formats de quelle façon dois-je suivre? livres/site web? –

+0

Les recommandations du livre sont hors sujet selon les règles du site. Vous avez dit que vous vouliez apprendre C, pas le développement web. Le format bitmap et le langage C sont rarement utilisés dans le développement web. –