You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在VB.Net中用ImageFormat.Png优化PNG大小并解决保存变大问题

嘿,我来帮你搞定这两个PNG保存的问题!

一、为什么保存后的PNG文件反而变大了?

这其实是System.Drawing.Image.Save()方法的默认行为导致的:

  • 默认情况下,.NET的PNG编码器没有启用压缩(或者用了最低压缩级别),而你原文件是经过压缩优化过的,自然保存后体积会膨胀。
  • 另外,加载图片后,内存中的图像可能会丢失原有的压缩信息,甚至被自动转换像素格式(比如原PNG是8位索引色,加载后变成24位真彩色),这也会大幅增加体积。
  • 最后,默认保存可能会保留额外的元数据(比如颜色配置文件、编辑痕迹),这些也会占额外空间。

你遇到的186×186图片从51.9KB变62.3KB,大概率就是默认无压缩+可能的像素格式转换导致的。

二、如何在VB.Net中优化PNG保存大小(甚至比原文件更小)?

下面给你两种实用的方案,都能实现压缩优化,让保存后的体积≤原文件:

方案1:使用System.Drawing.Imaging的编码器参数(纯WinForms/GDI+方案)

这个方案直接用你熟悉的System.Drawing命名空间,通过设置压缩级别和移除元数据来优化:

Imports System.Drawing.Imaging

' 加载原始图片
Using originalImage As Image = Image.FromFile("你的原图片路径.png")
    ' 1. 移除不必要的元数据(比如EXIF信息、颜色配置文件)
    For Each propItem As PropertyItem In originalImage.PropertyItems
        originalImage.RemovePropertyItem(propItem.Id)
    Next

    ' 2. 设置PNG最高压缩级别
    Dim encoderParams As New EncoderParameters(1)
    ' 压缩级别0-9,9是最高压缩,注意这里要用长整型(9L)
    encoderParams.Param(0) = New EncoderParameter(Encoder.Quality, 9L)

    ' 3. 获取PNG格式的编码器
    Dim pngEncoder As ImageCodecInfo = GetPngEncoder()

    ' 4. 保存优化后的图片
    originalImage.Save("test_optimized.png", pngEncoder, encoderParams)
End Using

' 辅助函数:获取PNG对应的编码器
Private Function GetPngEncoder() As ImageCodecInfo
    For Each codec As ImageCodecInfo In ImageCodecInfo.GetImageEncoders()
        If codec.FormatID = ImageFormat.Png.Guid Then
            Return codec
        End If
    Next
    Throw New Exception("未找到PNG编码器")
End Function

方案2:使用WPF的PngBitmapEncoder(压缩控制更精细)

如果你的项目可以引用WPF相关的程序集,这个方案的压缩效果可能更好,还能灵活控制交错模式等:

Imports System.Windows.Media.Imaging
Imports System.IO

' 加载图片(注意这里用WPF的BitmapImage)
Dim bitmapUri As New Uri("你的原图片路径.png", UriKind.RelativeOrAbsolute)
Dim originalBitmap As New BitmapImage(bitmapUri)

' 保存优化后的图片
Using outputStream As New FileStream("test_optimized_wpf.png", FileMode.Create)
    Dim pngEncoder As New PngBitmapEncoder()
    ' 设置最高压缩级别
    pngEncoder.CompressionLevel = PngCompressionLevel.BestCompression
    ' 关闭交错模式(交错会增加体积)
    pngEncoder.Interlace = PngInterlaceOption.Off
    ' 添加图像帧
    pngEncoder.Frames.Add(BitmapFrame.Create(originalBitmap))
    ' 保存到流
    pngEncoder.Save(outputStream)
End Using

额外优化技巧:保持原始像素格式

如果你的原PNG是8位索引色(这种格式体积通常更小),加载后可能被自动转换成24位真彩色,导致保存体积变大。你可以在保存前检查并保持原始格式:

' 检查原始图片的像素格式
If originalImage.PixelFormat = PixelFormat.Format8bppIndexed Then
    ' 如果是索引色,保存时尽量保持该格式
    ' 可以结合方案1的编码器参数,避免格式转换
End If

按照上面的方法操作,基本就能让保存后的PNG体积小于等于原文件了。

内容的提问来源于stack exchange,提问作者M. A.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:54:34