将内存中的 24 位图像转换为索引颜色

2024-01-03

我在内存中创建了一个格式为 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(使用前将#替换为@)

将内存中的 24 位图像转换为索引颜色 的相关文章

随机推荐