FreeImage,想说爱你不容易


由于一些原因,各种免费图像处理软件已经不能满足需求,这时候就需要自己动手造轮子了。搜一搜,第一个找到的是FreeImage。不得不说,这个东西,实在是非常傻瓜,还怕你不会用,带了个Wrapper,其中就有C++版的FreeImagePlus,使用起来更是傻瓜到极致。一下子就完成了之前图片批处理的想法。

一开始都是很圆满,包括自己弄的所谓的AJPG格式(颜色使用JPG,ALPHA使用PNG)。后来开始发现问题了,那是开始处理PNG8的时候,发现这玩意处理PNG8根本不知道如何下手,经常打开失败。一种PNG8打开失败,这时候你用PS转成PNG24再转会PNG8,就能打开了,另外转成PNG24也是打不开的。后来发现,如果用HGE提供的一个PNG转换工具转换后就可以打开,然后去看看那个工具的源码,竟然是使用D3DX函数去打开后读取纹理重新保存了图片。。。看到里面的PNGLIB还以为是用来转换的,竟然是用来保存而已。。。FreeImage是基于libPNG,也就是说原本就打不开的么,那为什么D3DX函数能打开,搞不懂。

打开PNG8是个问题,保存PNG8更是个问题,记得之前写过一个测试,貌似是可以保存为PNG8的DEMO,只是大小比PS保存的稍微大一点,奇怪的是后来再去找这个DEMO出来,发现不能用了!怎么都无法保存,记得之前是先转换到32位,然后再转成convertTo16Bits565,就可以保存成PNG8(在PS中确认),难道是我之前幻觉了?另外转换都是成功的,就是保存的时候会失败,可能和FreeImage本身挑图片有关吧,因为就打开PNG来说,有些能打开,有些却不能。PNG作为目前最常用的一种格式,不能解决这个问题真的很是蛋疼。另外我发现QT也不支持PNG8,PNG8难道本身就是奇葩么。不管是不是奇葩,作为一个高压格式在游戏中是非常受欢迎的。


============================

12月6日更新

============================

昨天晚上研究了一下,终于知道怎么保存为PNG8,于是想再现一次打不开某些PNG8的情况,蛋疼的是后来居然都顺利打开了!导致我没法再现,但也不能说明问题解决了。

于是保存为PNG8的方法为:


	FIBITMAP* fib;
	fib = FreeImage_Load(FIF_PNG, "0000.png");
	fib = FreeImage_ConvertTo32Bits(fib);
	fib = FreeImage_ConvertToType(fib, FIT_BITMAP);
	b=FreeImage_SaveU(FIF_PNG, fib, (name+L"_C.png").c_str());
	if (b==FALSE)
	{
		wprintf_s(L"保存失败!\n");
		system("pause");
	}
	FreeImage_Unload(fib);

你可能感兴趣的:(FreeImage,想说爱你不容易)