Creare un file immagine bitmap (*.bmp) – C/C++

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'IMMAGINEbitmap

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);
}

 

 

Precedente Creare una finestra JFrame - java Successivo Steganografia in un'immagine jpeg - JAVA