2009-12-07 21 views
8

No he estado programando en C++ por un tiempo, y ahora tengo que escribir algo simple, pero me está volviendo loco.C++ crear imagen

necesito para crear un mapa de bits de una tabla de colores: char image[200][200][3];

primera coordenada es la anchura, la altura de la segunda, tercera colores: RGB. ¿Cómo hacerlo?

Gracias por cualquier ayuda. Adam

+6

¿Qué formato de archivo? ¿Qué sistema operativo o bibliotecas estás usando? –

+0

Estoy usando Windows, aplicación simple de Visual Studio Win32. – Adam

+2

¿Está preguntando sobre un BITMAP de Windows GDI o un archivo .bmp? –

Respuesta

13

Estoy seguro de que ya ha comprobado http://en.wikipedia.org/wiki/BMP_file_format.

Con esa información en la mano podemos escribir una rápida 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); 

Si la configuración de las cabeceras es un problema, háganoslo saber.

Editar: Lo olvidé, los archivos BMP esperan BGR en lugar de RGB, he actualizado el código (sorprendió que nadie lo atrapó).

+3

Con la pregunta etiquetada C++, no C, sería mejor ver las secuencias de archivos que se utilizan. –

+0

Me resulta más fácil generar datos binarios con funciones de estilo C, pero recomiendo generalmente el enfoque de secuencias de archivos. –

0

Primero trataría de averiguar cómo se define el BMP file format (eso es lo que quiere decir con un mapa de bits, ¿verdad?). Luego convertiría la matriz a ese formato e imprimiría en el archivo.

Si esa es una opción, también consideraría intentar encontrar una biblioteca existente para la creación de archivos BMP, y solo usarla.

Disculpe si lo que dije ya es obvio para usted, pero no sé en qué etapa del proceso está atascado.

0

Sería recomendable inicializar la función como una simple matriz de 1 dimensión.

es decir (cuando los bytes es el número de bytes por píxel)

char image[width * height * bytes]; 

A continuación, puede acceder a la posición relevante en la matriz de la siguiente manera

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

Cuando se conocen los tamaños en tiempo de compilación, ¿por qué hacer todo esto, que el compilador hace automáticamente? –

+0

También obtuvo los cálculos incorrectos para los índices. –

+0

oops solucionó el problema del índice. En cuanto a por qué hacerlo explícitamente? De esta forma, obtendrá una mejor comprensión de EXACTAMENTE lo que está sucediendo. Cada uno por su cuenta. Personalmente, prefiero no tratar el compilador como una caja negra ... si el ancho, el alto y los bytes son valores constantes, se optimizarán de todos modos :) – Goz

0

Para las operaciones simples de imagen recomiendo altamente Cimg. Esta biblioteca funciona como un encanto, y es extremadamente fácil de usar. Solo tiene que incluir un archivo de encabezado en su código. Literalmente tardé menos de 10 minutos en compilar y probar.

Si desea realizar operaciones de imagen más complicadas, iría con Magick++ según lo sugerido por dagoof.