c# - 减小 PNG 图像的大小
问题描述
我想压缩PNG图像
我正在使用以下代码:(以下代码适用于 jpeg、jpg)但不适用于 png。
var qualityParam = new EncoderParameter(Encoder.Quality,80);
// PNG image codec
var pngCodec = GetEncoderInfo(ImageFormat.Png);
var encoderParams = new EncoderParameters(1) { Param = { [0] = qualityParam } };
rigImage.Save(imagePath, pngCodec, encoderParams);
private static ImageCodecInfo GetEncoderInfo(ImageFormat format)
{
// Get image codecs for all image formats
var codecs = ImageCodecInfo.GetImageEncoders();
// Find the correct image codec
return codecs.FirstOrDefault(t => t.FormatID == format.Guid);
}
解决方案
JPEG“工作正常”,因为它总是可以丢弃更多信息。
PNG 是一种无损图像压缩格式,因此获得更好的压缩效果比较棘手,并且有一个相当高的“低标记”。有诸如 PNGOut 或 OxiPNG 之类的工具仅用于优化 PNG 图像,但大多数策略的计算成本非常高,因此您的普通图像处理库就不会打扰:
- 您可以丢弃不相关的元数据块
- 您可以列举并尝试各种过滤策略,这相当于压缩图像数十次,调整略有不同并检查出最好的
- 您可以将 DEFLATE 实现从默认(通常是标准库或系统的标准)切换到更好但更昂贵的东西,如 zopfli
- 最后——这个绝对需要人类的眼球——你可以尝试切换到托盘化
如上所述,大多数图像库根本不会为此烦恼,它们将使用内置的 zlib/deflate 和一些默认过滤器,使 PNG 通过整个优化管道可能需要几分钟,并且有机会获得将不存在。
推荐阅读
- java - 我的 javafx 程序中有一个空指针异常。我是否正确阅读文本?
- python - 如何使用 Python 修改 Discord webhook 的通道
- canvas - 有没有办法让画布上的文本只用 CSS 属性就不会模糊?
- cucumber - 不可转换的类型;无法将“io.cucumber.java.Scenario”转换为“cucumber.runtime.ScenarioImpl”
- node.js - 测试完成后无法登录。您是否忘记在测试中等待异步内容?
- c# - .NET 4.8 没有为 Linux 创建自包含文件
- reactjs - 如何使用 React Hooks 渲染不同的组件
- sql-server - SQL Server 需要时间来执行查询,但 CPU、Read、Write 都很低
- python - TypeError:字符串索引在python中必须是整数
- c# - 如何将 ASP.NET Framework 配置迁移到 ASP.NET Core?