2009-12-07 18 views
8

Non ho programmato in C++ per un po ', e ora devo scrivere una cosa semplice, ma mi sta facendo impazzire.C++ creazione immagine

necessario creare una bitmap da una tabella di colori: char image[200][200][3];

coordinate primo è larghezza, seconda altezza, colori terzi: RGB. Come farlo?

Grazie per qualsiasi aiuto. Adam

+6

Che formato di file? Quale sistema operativo o librerie stai usando? –

+0

Sto usando Windows, semplice applicazione Visual Studio Win32. – Adam

+2

Stai chiedendo un BITMAP GDI di Windows o un file .bmp? –

risposta

13

Sono sicuro che hai già controllato http://en.wikipedia.org/wiki/BMP_file_format.

Con queste informazioni in mano siamo in grado di dare una rapida BMP con:

// setup header structs bmpfile_header and bmp_dib_v3_header before this (see wiki) 
// * note for a windows bitmap you want a negative height if you're starting from the top * 
// * otherwise the image data is expected to go from bottom to top * 

FILE * fp = fopen ("file.bmp", "wb"); 
fwrite(bmpfile_header, sizeof(bmpfile_header), 1, fp); 
fwrite(bmp_dib_v3_header, sizeof(bmp_dib_v3_header_t), 1, fp); 

for (int i = 0; i < 200; i++) { 
for (int j = 0; j < 200; j++) { 
    fwrite(&image[j][i][2], 1, 1, fp); 
    fwrite(&image[j][i][1], 1, 1, fp); 
    fwrite(&image[j][i][0], 1, 1, fp); 
} 
} 

fclose(fp); 

Se impostare le intestazioni è un problema fatecelo sapere.

Modifica: Ho dimenticato, i file BMP si aspettano BGR invece di RGB, ho aggiornato il codice (sorpreso nessuno l'ha preso).

+3

Con la domanda che viene codificata in C++, non in C, sarebbe meglio vedere i flussi di file usati. –

+0

Trovo più facile generare dati binari con le funzioni in stile C, ma raccomando generalmente l'approccio dei flussi di file. –

0

Vorrei innanzitutto provare a scoprire come viene definito il BMP file format (che cosa intendi per bitmap, vero?). Quindi convertirò la matrice in quel formato e la stamperò sul file.

Se questa è un'opzione, vorrei anche provare a cercare una libreria esistente per la creazione di file BMP e usarla.

Scusa se quello che ho detto è già ovvio per te, ma non so su quale fase del processo sei bloccato.

0

Sarebbe consigliabile inizializzare la funzione come un semplice array monodimensionale.

cioè (Dove byte è il numero di byte per pixel)

char image[width * height * bytes]; 

È quindi possibile accedere alla posizione di rilievo nella matrice come segue

char byte1 = image[(x * 3) + (y * (width * bytes)) + 0]; 
char byte2 = image[(x * 3) + (y * (width * bytes)) + 1]; 
char byte3 = image[(x * 3) + (y * (width * bytes)) + 2]; 
+2

Quando le dimensioni sono note al momento della compilazione, perché tutto questo, che il compilatore fa automaticamente? –

+0

Hai anche sbagliato la matematica per gli indici. –

+0

oops ha risolto il problema con l'indice. Per quanto riguarda perché farlo in modo esplicito? In questo modo ottieni una comprensione molto migliore di ESATTAMENTE quello che sta succedendo. Ognuno per il proprio. Personalmente preferisco non trattare il compilatore come una scatola nera ... se larghezza, altezza e byte sono valori costanti saranno comunque ottimizzati :) – Goz

0

Per semplici operazioni di immagine lo consiglio vivamente Cimg. Questa libreria funziona come un fascino ed è estremamente facile da usare. Devi solo includere un file di intestazione nel tuo codice. Mi ci sono voluti letteralmente meno di 10 minuti per compilare e testare.

Se si desidera eseguire operazioni di immagine più complesse, tuttavia, andrei con Magick++ come suggerito da dagoof.