Creare una immagine bitmap
Per creare un'immagine bisogna sapere che il file di un'immagine si divide in 3 parti:
- Titolo del File
- Titolo Immagine
- Corpo dell'Immagine
TITOLO DEL FILE
Offset | Dimensione (Bytes) | Valore esadecimale | Valore | Descrizione |
00h | 2 | 42 4D | "BM" | Firma del file per Bitmap Windows |
02h | 4 | 46 00 00 00 | 70 | Dimensione del file totale |
04h | 4 | 00 00 00 00 | riservato | riservato |
06h | 4 | 36 00 00 00 | 54 | Indirizzo del byte dove inizia il corpo dell'immagine |
TITOLO IMMAGINE
Offset | Dimensione (Bytes) | Valore esadecimale | Valore | Descrizione |
0Eh | 4 | 28 00 00 00 | 40 | Lunghezza di questo header |
12h | 4 | 02 00 00 00 | 2 | larghezza in pixel |
16h | 4 | 02 00 00 00 | 2 | altezza in pixel |
1AH | 2 | 01 00 | 1 | Numero di piani deve essere sempre 1 |
1Ch | 2 | 18 00 | 24 | numero di bit per pixel |
1Eh | 4 | 00 00 00 00 | 0 | Nessuna compressione |
22h | 4 | 10 00 00 00 | 16 | dimensione del corpo dell'immagine in bytes |
26h | 4 | 13 0B 00 00 | 2835 | Risoluzione orizzontale pixel/metro |
2Ah | 4 | 13 0B 00 00 | 2835 | Risoluzione verticale pixel/metro |
2Eh | 4 | 00 00 00 00 | 0 | Colori da considerare (0 indica tutti i colori) |
32h | 4 | 00 00 00 00 | 0 | 0 indica che tutti i colori sono importanti |
CORPO DELL'IMMAGINE
Si deve partire da pixel in basso a sinistra, ogni linea di immagine deve essere descritta con un numero di byte multiplo di 4 altrimenti bisogna completarla inserendo degli 0 a fine linea.
Offset | Dimensione (bytes) | Valore esadecimale | Valore | Descrizione |
36h | 3 | 00 00 FF | 00 00 255 | Rosso RGB(255,0,0) |
39h | 3 | FF FF FF | 255 255 255 | Bianco RGB(255,255,255) |
3Ch | 2 | 00 00 | 00 00 | Riempimento linea |
3Eh | 3 | FF 00 00 | 255 00 00 | Blu RGB(0,0,255) |
41h | 3 | 00 FF 00 | 00 255 00 | Verde RGB(0,255,0) |
44h | 2 | 00 00 | 00 00 | Riempimento linea |
ESEMPIO IN C
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fimg; char R,G,B; char titfile[2]={'B','M'}; // titolo file bitmap windows; int sizeX=2; //larghezza in pixel int sizeY=2; //altezza in pixel int dimensione; int offsetimg; int dimensioneheader; int npiani=1; //numero piani int nbpp = 24; // numero bit per pixel int compressione=0; int dimensioneimg; //dimensione immagine int rispixelmetro=1; //risoluzione pixel/metro int colori=0; dimensione=(sizeX*sizeY*4)+54; offsetimg=54; dimensioneheader=40; dimensioneimg=dimensione-54; // Apriamo il file bitmap fimg=fopen("img.bmp","wb"); /** titolo file **/ // firma fseek(fimg,0,SEEK_SET); fwrite(&titfile,2,1,fimg); // dimensione file fseek(fimg,2,SEEK_SET); fwrite(&dimensione,4,1,fimg); // spostamento file fseek(fimg,10,SEEK_SET); fwrite(&offsetimg,4,1,fimg); /** Titolo Immagine **/ // Dimensione Header fseek(fimg,14,SEEK_SET); fwrite(&dimensioneheader,4,1,fimg); // larghezza immagine fseek(fimg,18,SEEK_SET); fwrite(&sizeX,4,1,fimg); // altezza immagine fseek(fimg,22,SEEK_SET); fwrite(&sizeY,4,1,fimg); // numero piani fseek(fimg,26,SEEK_SET); fwrite(&npiani,2,1,fimg); // numero bit(colore) per pixel fseek(fimg,28,SEEK_SET); fwrite(&nbpp,2,1,fimg); // compressione fseek(fimg,30,SEEK_SET); fwrite(&compressione,4,1,fimg); // Dimensione immagine in byte fseek(fimg,34,SEEK_SET); fwrite(&dimensioneimg,4,1,fimg); // risoluzione orizzontale fseek(fimg,38,SEEK_SET); fwrite(&rispixelmetro,4,1,fimg); // risoluzione verticale fseek(fimg,42,SEEK_SET); fwrite(&rispixelmetro,4,1,fimg); // compressione fseek(fimg,46,SEEK_SET); fwrite(&colori,4,1,fimg); // compressione fseek(fimg,50,SEEK_SET); fwrite(&colori,4,1,fimg); }