web-dev-qa-db-fra.com

Chargement d'images C/C++

Je travaille sur un moteur de jeu et j'aime trop écrire des chargeurs d'images pour plusieurs formats, alors ma question est la suivante: existe-t-il une bibliothèque de chargement d'images abstraites pour charger des fichiers images? J'ai juste besoin de charger des fichiers puis de les splat sur l'écran en utilisant un tableau de pixels.

12
Jookia

Je suis toujours fan de CImg . C'est très facile à utiliser. Un autre utilisateur a également aimé la réponse . Je posterai le même exemple que dans la réponse afin que vous puissiez voir comme il est facile d’accéder aux informations sur les pixels et les dimensions.

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;
23
NG.

FreeImage est une bonne bibliothèque open source

Voici un exemple de code, les données sont accessibles avec "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);
11
Tomaka17

Il y a Boost's GIL qui a été développé à l'origine par Adobe. Ce n'est peut-être pas le plus intuitif, mais c'est certainement l'une des bibliothèques les plus complètes et les plus puissantes.

4
Gianni

Si vous utilisez OpenGL, alors DevIL est un bon choix car son style et ses conventions adhèrent à OpenGL plus que toute autre bibliothèque. Il est relativement facile à configurer et prend également en charge plusieurs formats.

Une chose à propos de la chose wuss. Bien qu'il soit agréable de configurer du code tiers fonctionnel qui a été bien testé et qui vous fait gagner du temps, il y a également quelque chose à dire sur le fonctionnement du chargement d'images et sur les raisons pour lesquelles cela fonctionne ainsi. Si vous voulez vraiment réussir dans quelque chose, je crois que vous devez réellement apprendre à le faire à partir de zéro. Même si vous finissez par utiliser un code tiers.

3
Zoli

Vous pouvez consulter SDL_Image , un sous-projet du Simple DirectMedia Layer . C'est une abstraction facile pour charger plusieurs formats d'image différents. SDL est écrit en C mais est facile à utiliser avec du code C ou C++.

2
Michael Kristofik

Une autre possibilité (principalement, sinon exclusivement pour Windows) est CXImage . Son avantage évident par rapport à de nombreux autres est la prise en charge de nombreux formats Camera Raw, au cas où cela vous importerait.

1
Jerry Coffin

OpenImageIO prend en charge de nombreux formats de fichiers différents parmi lesquels 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 et GIF

0
Vertexwahn