2009-12-16 102 views
10

¿Cómo abrir y leer los píxeles de una imagen en C++? Léelos en forma de X, Y y para conocer el color.Lectura de píxeles de la imagen en C++

+1

cualquier formato de imagen en particular? Los diferentes formatos tienen diferentes bibliotecas. –

+1

¿Qué formato es la imagen? BMP? PNG? JPEG? –

+0

Probablemente JPG o BMP. Se extraerá de openGL, así que aún no estoy seguro. ¿Importa? Si es así, ¿cuál es mejor? –

Respuesta

3

Si usted va a estar trabajando con imágenes que usted debe buscar en la biblioteca OpenCV, que tiene prácticamente todo necesitas trabajar con imágenes

OpenCV 2.0 salió hace un par de meses y es muy amigable con C++.

+4

OpenCV es exagerado solo por leer imágenes. –

+0

Sí, es una gran biblioteca, solo lo estoy poniendo como una opción si quiere hacer otras cosas además de leer/escribir sería bueno familiarizarse con eso. – rem7

5

Utilice una biblioteca como DevIL (http://openil.sourceforge.net/). DevIL cargará los datos de la imagen en una matriz y podrá acceder a los datos de píxel sin procesar usando una función como ilGetPixels() más o menos.

DevIL también tiene soporte para OpenGL.

+0

s/ilGetPixels()/ilGetData() –

2

BMP son increíblemente simples. Las BMP sin comprimir constan de un encabezado, cierta información sobre el BMP, la paleta de colores (si corresponde) y luego los datos del mapa de bits, píxel por píxel. Escribir su propio analizador de mapas de bits es un ejercicio divertido, aunque hay mucho trabajo extra manejando todas las características (8 bits, compresión RLE, etc.).

Su mejor opción es usar una biblioteca. Image Magick tiene una biblioteca C que le permitirá abrir casi cualquier formato de imagen y acceder a los píxeles. SDL_image es otra biblioteca que es muy fácil de usar y SDL se puede usar fácilmente con OpenGL.

Qué formato de imagen debe utilizar dependerá de la aplicación. Los JPG tienen una compresión bastante buena, pero la compresión es PÉRDIDA, lo que significa que pierdes detalles. Si la imagen tiene texto, o tiene áreas grandes de colores sólidos o bordes (como un cómic), esto es malo, obtendrá un artefacto notable. Para las fotos, los JPG generalmente están bien. Los PNG son una buena alternativa, están comprimidos pero la compresión es SIN PÉRDIDA. Los JPG generalmente serán más pequeños que los PNG, ambos serán más pequeños que los BMP.

4

O utiliza una biblioteca existente o escribe su propio código. En general, el primer enfoque es mejor, ya que un formato de archivo de imagen suele ser más complejo de lo que parece en la superficie y puede terminar con imágenes al revés o un orden incorrecto de componentes de color si no tiene cuidado.

Dependiendo de sus requisitos, es posible que también necesite tomar las capacidades del formato en consideración. Si el soporte para un alto rango dinámico es interesante, OpenEXR es una gran opción, si no lo es, probablemente sea un inconveniente, ya que no cuenta con un soporte tan grande entre otros programas como, por ejemplo, PNG.

Aquí hay dos bibliotecas que a menudo recurren a cuando se necesita para leer y escribir imágenes: libpng, OpenExr

+0

Usamos libpng para la generación de imágenes, es muy fácil de usar y un código C++ puro, así que no hay necesidad de lidiar con una interfaz cutre. –

+1

@Matthieu M .: libpng ciertamente no está escrito en "puro C++". Está escrito en C89, como lo indica en la página enlazada por Laserallan. – unwind

5

Leyendo el color de un píxel de un archivo de imagen utilizando la biblioteca Magick++

#include <Magick++.h> 
#include <iostream> 

using namespace Magick; 
using namespace std; 

int main(int argc, char **argv) { 
try { 
    InitializeMagick(*argv); 
    Image img("C:/test.bmp"); 
    ColorRGB rgb(img.pixelColor(0, 0)); // ie. pixel at pos x=0, y=0 
    cout << "red: " << rgb.red(); 
    cout << ", green: " << rgb.green(); 
    cout << ", blue: " << rgb.blue() << endl; 
} 
    catch (Magick::Exception & error) { 
    cerr << "Caught Magick++ exception: " << error.what() << endl; 
} 
return 0; 
} 
Cuestiones relacionadas