使用 FreeImage 库减少 PNG-8 调色板中的颜色数量 (C#)

发布于 2025-01-04 14:44:30 字数 1133 浏览 5 评论 0原文

我使用 FreeImageNET 库来量化我的位图,因为

using (FreeImageAPI.FreeImageBitmap fiBitmap = FreeImageAPI.FreeImageBitmap.FromHbitmap(bmp.GetHbitmap()))
            {
                if (fiBitmap.ColorDepth > 24)
                {
                    fiBitmap.ConvertColorDepth(FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_08_BPP);
                }

                //quantize using the NeuQuant neural-net quantization algorithm 
                fiBitmap.Quantize(FreeImageAPI.FREE_IMAGE_QUANTIZE.FIQ_NNQUANT, 256);


                fiBitmap.Save("test_z.png", FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PNG, FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.PNG_Z_BEST_COMPRESSION);

                //fiBitmap.Save(ms, FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PNG, FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.PNG_Z_DEFAULT_COMPRESSION);
            }

这给了我一个 PNG-8,带有 256 种颜色的调色板。 使用 Photoshop,我发现,如果我使用自适应算法和减少的调色板(例如 128、64、16 等),我可以进一步减小尺寸。再次重新打开它会显示 Photoshop 填充了那些剩余(较高)索引中的灰度级。

我无法使用 FreeImageAPI.FreeImageBitmap.Quantize() 制作出类似的 PNG,且调色板有限,a la PIL convert() ,您可以在其中使用可以指定算法和调色板大小。

谢谢。

I was using the FreeImageNET libary to Quantize my Bitmap as

using (FreeImageAPI.FreeImageBitmap fiBitmap = FreeImageAPI.FreeImageBitmap.FromHbitmap(bmp.GetHbitmap()))
            {
                if (fiBitmap.ColorDepth > 24)
                {
                    fiBitmap.ConvertColorDepth(FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_08_BPP);
                }

                //quantize using the NeuQuant neural-net quantization algorithm 
                fiBitmap.Quantize(FreeImageAPI.FREE_IMAGE_QUANTIZE.FIQ_NNQUANT, 256);


                fiBitmap.Save("test_z.png", FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PNG, FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.PNG_Z_BEST_COMPRESSION);

                //fiBitmap.Save(ms, FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PNG, FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.PNG_Z_DEFAULT_COMPRESSION);
            }

This gives me a PNG-8, with a palette of 256 colors.
Using Photoshop I found, I could further reduce the size if I used Adaptive Algorithm with reduced color palette say 128, 64, 16 etc. Reopening it again shows Photoshop fills in grey levels in those remaining(higher) indexes.

I cannot get FreeImageAPI.FreeImageBitmap.Quantize() to churn out a similar PNG, with limited palette, a la PIL convert() where you can specify both the algorithm and the palette size.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

叶落知秋 2025-01-11 14:44:30

最终通过使用互联网上的开源代码重新实现了量化。

Ended up re-implementing quantization by using open-source codes from the Internet.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文