2010-01-16 55 views
14

Necesito leer un archivo de imagen en C/C++. Sería genial, si alguien puede publicar el código para mí.Lectura de un archivo de imagen en C/C++

Trabajo en imágenes de escala de grises y las imágenes son JPEG. Me gustaría leer las imágenes en una matriz 2D que facilitará mi trabajo.

Gracias de antemano

+0

Es la documentación de libjpeg (http://www.ijg.org/) o lo que sea nativo API tiene inadecuada ? – greyfade

+1

No olvides elegir una respuesta correcta para las tres preguntas que has hecho. – mwcz

Respuesta

2

Pruebe la biblioteca CImg. El tutorial lo ayudará a familiarizarse. Una vez que tenga un objeto CImg, la función data() le dará acceso a la matriz de búfer de píxeles 2D.

+0

En realidad se modela como una matriz de píxeles 4D, aunque una imagen 2D en escala de grises tendrá la profundidad y la dimensión de color establecidas en 1. Debajo del capó hay una matriz 1D de plantilla tipo T. – jiggunjer

+0

Creo que CImg requiere libjpeg para cargar jpegs. –

12

Puedes escribir el tuyo mirando JPEG format.

Dicho esto, pruebe una biblioteca preexistente como CImg, o Boost's GIL. O para estrictamente JPEG, libjpeg. También está la clase CxImage en CodeProject.

Aquí hay un big list.

+1

Boost.GIL no funciona y no se mantiene. – Tronic

+1

Como C está permitido, el segundo libjpeg es la solución más liviana. CImg y GIL son definitivamente más sencillos en cuanto a la sintaxis, pero también requieren libjpeg. Puede copiar trivialmente los datos de un objeto CImg en algún contenedor STL o en una matriz. – jiggunjer

+0

CImg también utiliza una licencia similar a LGPL que es significativamente más restrictiva que la licencia tipo BSD de libjpeg. – TypeIA

2

corona es agradable. Desde el tutorial:

corona::Image* image = corona::OpenImage("img.jpg", corona::PF_R8G8B8A8); 
if (!image) { 
    // error! 
} 

int width = image->getWidth(); 
int height = image->getHeight(); 
void* pixels = image->getPixels(); 

// we're guaranteed that the first eight bits of every pixel is red, 
// the next eight bits is green, and so on... 
typedef unsigned char byte; 
byte* p = (byte*)pixels; 
for (int i = 0; i < width * height; ++i) { 
    byte red = *p++; 
    byte green = *p++; 
    byte blue = *p++; 
    byte alpha = *p++; 
} 

píxeles serían una matriz unidimensional, pero se puede convertir fácilmente una x dada y la posición y a una posición en una matriz de 1D. Algo así como pos = (y * anchura) x +

3

Salida Intel abierto CV biblioteca ...

5

Si decide ir por un enfoque mínimo, sin dependencias libpng/libjpeg, sugiero usar stb_image y stb_image_write, encontrado here.

Es tan simple como se pone, solo necesita colocar los archivos de encabezado stb_image.h y stb_image_write.h en su carpeta.

Aquí está el código que se necesita leer imágenes:

#include <stdint.h> 

#define STB_IMAGE_IMPLEMENTATION 
#include "stb_image.h" 

int main() { 
    int width, height, bpp; 

    uint8_t* rgb_image = stbi_load("image.png", &width, &height, &bpp, 3); 

    stbi_image_free(rgb_image); 

    return 0; 
} 

Y aquí está el código para escribir una imagen:

#include <stdint.h> 

#define STB_IMAGE_WRITE_IMPLEMENTATION 
#include "stb_image_write.h" 

#define CHANNEL_NUM 3 

int main() { 
    int width = 800; 
    int height = 800; 

    uint8_t* rgb_image; 
    rgb_image = malloc(width*height*CHANNEL_NUM); 

    // Write your code to populate rgb_image here 

    stbi_write_png("image.png", width, height, CHANNEL_NUM, rgb_image, width*CHANNEL_NUM); 

    return 0; 
} 

puede compilar sin banderas o dependencias:

g++ main.cpp 

Otras alternativas livianas incluyen:

+1

Tuve que incluir la biblioteca math.h y vincularla mientras compilaba (http://stackoverflow.com/questions/8671366/undefined-reference-to-pow-and-floor) o me daría una referencia indefinida de pow en la biblioteca de imágenes. –

+0

Sé que es solo un ejemplo, pero ¿puedes aclarar qué significa el número mágico 3 en el código? – mattshu

+1

@mattshu es el número de canales (rojo, verde, azul), tal vez debería aclarar esto en mi código, voy a hacer una edición. –