C/C++ 图像加载

17

我正在开发一个游戏引擎,但是我太懦弱了,无法编写多种格式的图像加载器。我的问题是:是否有抽象的图像加载库来加载图像文件?我只需要加载文件,然后使用像素数组将它们展现在屏幕上。


16
成为懦夫似乎是正确的方法。不要重复发明轮子。 - Tom
https://dev59.com/1XnZa4cB1Zd3GeqPqn7x#28633405 - Iman
7个回答

29

我一直是CImg的粉丝。它非常易于使用。另一个用户也喜欢这个答案。我将发布与答案中相同的示例,以便您可以看到访问像素和尺寸信息有多容易。

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;

很遗憾他们没有64位端口。至少在他们的常见问题解答中是这样说的。 - Jonas Schäfer
你的意思是什么?这个库只是一个头文件,可以在64位模式下编译。 - Maciej Szpakowski
这对 RGB 图像也适用吗?可能不行,因为你需要一个数组而不是 unsigned char? - so860
链接现在已经失效。 - Nuclear_Man_D

11

FreeImage是一个优秀的开源库。

这里有一个示例代码,数据可以通过"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);

C++的包装器似乎有点问题,至少在g++上是这样。链接库存在问题,不过C版本运行良好。 - jiggunjer
由于某种原因,库头文件尝试定义“_WINDOWS_”,这会干扰Windows.h头文件。Windows.h头文件将其用作包含保护。不确定解决此问题的适当方法是什么。 - Spidey

4

有一个被Adobe最初开发的Boost's GIL。虽然它可能不是最直观的,但它肯定是其中一个最完整和强大的库。


1
boost::gil 本身不会加载任何图像格式。它提供了一个统一的接口来执行像素算法。在 boost::gil 中的图像加载器助手需要您拥有相应的库(例如 libtifflibpng 等)。 - kizzx2
1
这也适用于CImg,它本身支持一些格式,其余需要第三方库。 - jiggunjer

3
你可以看一下 SDL_Image,它是Simple DirectMedia Layer的一个子项目。它作为一种简单的抽象,用于加载多种不同的图像格式。SDL是用C语言编写的,但使用C或C++代码都很容易。

1
OP甚至没有暗示C和C++是“一种语言”。 OP正在寻找的解决方案要么是C,要么是C ++。 - Gregor Brandt
@gbrandt,我更新了我的答案以反映SDL的实现语言。 - Michael Kristofik

3
如果你正在使用OpenGL,那么DevIL是一个不错的选择,因为它的风格和约定符合OpenGL的标准。它相对容易设置,并且支持多种格式。关于“懒惰”的问题,虽然使用经过测试的第三方代码可以节省时间,但也需要了解图像加载的工作原理以及其原因。如果你真的想变得更好,我认为你需要从头开始学习如何做到这一点,即使最终你使用第三方代码。

1

另一个可能性(主要是针对 Windows)是 CXImage。它比许多其他库的明显优势在于支持许多相机原始格式,如果这对您很重要的话。


0

OpenImageIO支持许多不同的文件格式,其中包括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和GIF。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接