我在内存中创建了一个格式为 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.dll
和 FreeImage.dll
可以。如果您没有意识到 FreeImageNet
!= FreeImage
!
关于.net - 将内存中的 24 位图像转换为索引颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/727987/