2009-12-07 3 views
8

Je n'ai pas été la programmation en C++ pour un certain temps, et maintenant je dois écrire une chose simple, mais ça me rend dingue.C++ création d'une image

je créer une image bitmap à partir d'un tableau de couleurs: char image[200][200][3];

première coordonnée est la largeur, la hauteur seconde, troisième couleurs: RGB. Comment faire?

Merci pour toute aide. Adam

+6

Quel format de fichier? Quel système d'exploitation ou bibliothèques utilisez-vous? –

+0

J'utilise Windows, simple application Visual Studio Win32. – Adam

+2

Vous posez des questions sur un fichier GDI BITMAP ou un fichier .bmp? –

Répondre

13

Je suis sûr que vous avez déjà vérifié http://en.wikipedia.org/wiki/BMP_file_format.

Avec cette information en main, nous pouvons écrire un BMP rapide avec:

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

Si la mise en place des en-têtes est un problème nous le faire savoir.

Edit: J'ai oublié, les fichiers BMP attendent BGR au lieu de RVB, je l'ai mis à jour le code (surpris personne ne l'a attrapé).

+3

Avec la question étant étiquetée C++, pas C, il serait plus agréable de voir les flux de fichiers utilisés. –

+0

Je trouve plus facile de sortir des données binaires avec des fonctions de style C, mais je recommande l'approche des flux de fichiers en général. –

0

Je voudrais d'abord essayer de savoir, comment le BMP file format (c'est ce que vous entendez par un bitmap, non?) Est défini. Ensuite, je convertir le tableau à ce format et l'imprimer dans le fichier.

Si c'est une option, je voudrais également envisager d'essayer de trouver une bibliothèque existante pour la création de fichiers BMP, et juste l'utiliser.

Désolé si ce que je dis est déjà évident pour vous, mais je ne sais pas sur quelle étape du processus, vous êtes coincé.

0

Il serait souhaitable d'initialiser la fonction en tant que 1 tableau à une dimension simple.

ie (Où octets est le nombre d'octets par pixel)

char image[width * height * bytes]; 

Vous pouvez alors accéder à la position pertinente dans le tableau comme suit

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

Lorsque les tailles sont connues au moment de la compilation, pourquoi tout cela, que le compilateur fait pour vous automatiquement? –

+0

Vous avez également mal calculé pour les indices. –

+0

oups a corrigé le problème d'index. En ce qui concerne pourquoi explicite? De cette façon, vous obtenez une bien meilleure compréhension de EXACTEMENT ce qui se passe. Chacun à leur propre. Personnellement, je préfère ne pas traiter le compilateur comme une boîte noire ... si la largeur, la hauteur et les octets sont des valeurs constantes, ils seront optimisés de toute façon :) – Goz

0

Pour les opérations simples d'image que je recommande fortement Cimg. Cette bibliothèque fonctionne comme un charme et est extrêmement facile à utiliser. Vous devez simplement inclure un fichier d'en-tête dans votre code. Il m'a littéralement fallu moins de 10 minutes pour compiler et tester.

Si vous voulez cependant, je voudrais aller faire des opérations d'image plus compliquées avec Magick++ comme suggéré par dagoof.