2010-07-19 20 views
10

Estoy trabajando en un motor de juegos y soy demasiado astuto para escribir cargadores de imágenes para múltiples formatos, así que mi pregunta es esta: ¿Hay una biblioteca de carga de imágenes abstractas para cargar archivos de imágenes ? Solo necesito cargar archivos y luego colocarlos en la pantalla usando una matriz de píxeles.C/C++ Image Loading

+2

¿Qué plataforma? – bshields

+13

Ser un cobarde parece ser el enfoque correcto. No reinventes la rueda. – Tom

+0

http://stackoverflow.com/a/28633405/184572 –

Respuesta

23

Siempre soy un fan de CImg. Es muy fácil de usar. A otro usuario le gustó the answer también. Publicaré el mismo ejemplo que publiqué en la respuesta para que pueda ver lo fácil que es acceder a los píxeles y la información de la dimensión.

CImg<unsigned char> src("image.jpg"); 
int width = src.width(); 
int height = src.height(); 
unsigned char* ptr = src.data(10,10); // get pointer to pixel @ 10,10 
unsigned char pixel = *ptr; 
+0

Es una pena que no tengan un puerto de 64 bits. Al menos lo dicen en sus preguntas frecuentes. –

+0

¿Qué quieres decir? Esta biblioteca es solo un archivo de cabecera y se compila en modo de 64 bits. –

11

FreeImage es una buena biblioteca de código abierto

Aquí hay un código de ejemplo, los datos son accesibles con "out.data()"

FREE_IMAGE_FORMAT format = FreeImage_GetFileTypeU(filename.c_str()); 
if (format == FIF_UNKNOWN)  format = FreeImage_GetFIFFromFilenameU(filename.c_str()); 
if (format == FIF_UNKNOWN)  throw(std::runtime_error("File format not supported")); 

FIBITMAP* bitmap = FreeImage_LoadU(format, filename.c_str()); 
FIBITMAP* bitmap2 = FreeImage_ConvertTo32Bits(bitmap); 
FreeImage_Unload(bitmap); 

std::vector<char> out(FreeImage_GetWidth(bitmap2) * FreeImage_GetHeight(bitmap2) * 4); 
FreeImage_ConvertToRawBits((BYTE*)out.data(), bitmap2, FreeImage_GetWidth(bitmap2) * 4, 32, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, true); 

FreeImage_Unload(bitmap2); 
+0

El contenedor de C++ parece un poco problemático, al menos con g ++. Vincular la biblioteca es problemático, aunque la versión c funciona bien. – jiggunjer

1

Usted puede echar un vistazo a SDL_Image, un subproyecto del Simple DirectMedia Layer. Sirve como una simple abstracción para cargar varios formatos de imagen diferentes. SDL está escrito en C pero es fácil de usar con el código C o C++.

+0

OP ni siquiera implica que C y C++ sean 'un lenguaje'. OP está buscando una solución que sea C o C++. –

+0

@gbrandt, actualicé mi respuesta para reflejar el lenguaje de implementación para SDL. –

3

Si está utilizando OpenGL, entonces DevIL es una buena opción ya que su estilo y convenciones se adhieren a OpenGL más que a cualquier otra biblioteca. Es relativamente fácil de configurar y también tiene un gran soporte para múltiples formatos.

Una cosa sobre la cosa wuss. Si bien es bueno configurar un código de terceros que funcione correctamente y que le haya ahorrado tiempo, también se puede decir algo sobre cómo funciona la carga de imágenes y por qué funciona de la manera en que funciona. Si realmente quieres ser bueno en algo, creo que realmente necesitas aprender a hacerlo desde cero. Incluso si termina usando código de terceros al final.

1

Otra posibilidad más (principalmente, si no exclusivamente para Windows) es CXImage. Su ventaja obvia sobre muchos otros es admitir muchos formatos de cámara sin procesar, en caso de que eso sea importante para usted.

4

Hay Boost's GIL que fue desarrollado originalmente por Adobe. Puede que no sea el más intuitivo, pero sin duda es una de las libs más completas y poderosas.

+1

'boost :: gil' no carga por sí mismo ningún formato de imagen. Lo que hace es proporcionar una interfaz uniforme para realizar algoritmos de píxeles. Los ayudantes del cargador de imágenes en 'boost :: gil' requieren que tenga las bibliotecas correspondientes (por ejemplo,' libtiff', 'libpng', etc.) – kizzx2

+1

que también se aplica a CImg, admite algunos formatos de forma nativa, el resto necesita 3er. bibliotecas de fiestas – jiggunjer

0

OpenImageIO es compatible con muchos formatos diferentes de archivos entre ellos TIFF, JPEG/JFIF, OpenEXR, PNG, HDR/RGBE, ICO, BMP, Targa, JPEG-2000, Rman zfile, FITS, DDS, Softimage PIC, PNM, DPX, Cineon, IFF, Field3D, Ptex, Photoshop PSD, Wavefront RLA, SGI, WebP y GIF