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

标签 .net gdi+ system.drawing

我在内存中创建了一个格式为 Format24bppRgb 的图像。

我将其保存为 PNG,大小为 24kb。

如果我使用 Photoshop 将同一图像保存为 24 位 PNG,则其大小大致相同,但如果我将其保存为仅 32 色的 8 位 PNG,则大小会降至 5kb。

如何使用 C#/GDI+/System.Drawing 创建 PNG 文件的索引版本?

我很难找到这个问题的任何答案,这些答案不仅仅适用于灰度图像或需要外部库。在 GDI+ 中不可能吗?

最佳答案

我最终使用了 FreeImageAPI DLL ,带有 C# 包装器。我尝试避免使用第三方库,但我认为没有其他选择。它看起来是一个非常标准且使用良好的库。

就我而言,我有一个动态创建的 System.Drawing.Image 对象 'image' - 我想将其作为压缩文件保存到 HttpContext 输出流中图像。请注意,Image 没有所需的 GetHbitmap() 方法,但 Bitmap 有。

// 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 :-)

提示:运行时,请确保您的 bin 中同时存在“FreeImageNET”和“FreeImage”dll。目前,C# 示例项目包含对“Library.DLL”的引用,但其 zip 文件中似乎不存在该引用。使用 FreeImageNET.dllFreeImage.dll 可以。如果您没有意识到 FreeImageNet != FreeImage !

,您将收到恼人的文件未找到错误

关于.net - 将内存中的 24 位图像转换为索引颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/727987/

相关文章:

c# - 使用 NetworkStream.BeginRead 和 NetworkStream.EndRead 实现超时

c# - 如何更改可选面板的边框颜色?

c# - 如何绘制不断变化的图形

c# - 如何等待onPaint完成绘画(C#)

c# - 保存图像时如何找到一般 GDI+ 错误的原因?

c# - C# 中的图像调整大小 - 确定调整大小尺寸(高度和宽度)的算法

c# - "Gracefully"杀死进程

c# - 当 SignalR 一次建立 8-10 个连接时,实时聊天不起作用

c# - 如何在光标位置裁剪图像的一部分?

c# - 如何确定 .NET 代码是否在 ASP.NET 进程中运行?