我在内存中创建了一个格式为 Format24bppRgb 的图像。
我将其保存为 PNG,大小为 24kb。
如果我使用 Photoshop 将相同的图像保存为 24 位 PNG,则其大小大致相同,但如果我将其保存为仅 32 色的 8 位 PNG,则大小会降至 5kb。
如何使用 C# / GDI+ / System.Drawing 创建 PNG 文件的索引版本?
我很难找到这个问题的任何答案,这些答案不仅仅适用于灰度图像或需要外部库。在 GDI+ 中不可能吗?
我最终使用了FreeImageAPI 动态链接库 http://freeimage.sourceforge.net/,带有 C# 包装器。我尝试避免使用第三方库,但我认为没有其他选择。它似乎是一个非常标准且使用良好的库。
就我而言,我有一个System.Drawing.Image
object 'image'
这是动态创建的 - 我想将其作为压缩图像保存到 HttpContext 输出流中。注意Image
没有所需的GetHbitmap()
方法,但是Bitmap
does.
// convert image to a 'FreeImageAPI' image
var fiBitmap = FreeImageAPI.FreeImageBitmap.FromHbitmap((image as Bitmap).GetHbitmap());
fiBitmap.ConvertColorDepth(FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_08_BPP);
// see http://stackoverflow.com/questions/582766
MemoryStream ms = new MemoryStream();
fiBitmap.Save(ms, FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PNG, FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.PNG_Z_BEST_COMPRESSION);
context.HttpContext.Response.OutputStream.Write(ms.ToArray(), 0, (int)ms.Length);
我的 24kb 位图现在只有 9kb :-)
Tip:当您运行它时,请确保您的 bin 中同时存在“FreeImageNET”和“FreeImage”dll。目前,C# 示例项目包含对“Library.DLL”的引用,但其 zip 文件中似乎不存在该引用。使用FreeImageNET.dll
and FreeImage.dll
虽然有效。如果您没有意识到这一点,您将收到恼人的文件未找到错误FreeImageNet
!= FreeImage
!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)