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

ASP.NET中如何使用libwebp.dll将WebP图片保存至磁盘?

如何将编码后的WebP图片保存到磁盘

嗨,我来帮你搞定这个问题!你已经完成了libwebp的配置和基础函数声明,接下来只需要把编码后的内存数据写入磁盘,再清理内存就可以了。咱们一步步来:

1. 补全缺失的函数声明

你之前的WebPFree声明没写完,先补全它——这是释放libwebp分配内存的关键函数:

Private Declare Sub WebPFree Lib "libwebp.dll" (ByVal p As IntPtr)

2. 完整的保存流程代码示例

下面是一个完整的示例函数,接收Bitmap图片、质量参数和保存路径,完成编码+保存的全流程:

Imports System.IO
Imports System.Drawing
Imports System.Runtime.InteropServices

Public Class WebPSaver
    ' 你的原有函数声明
    Private Declare Function WebPEncodeBGRA Lib "libwebp.dll" (
        ByVal rgba As IntPtr,
        ByVal width As Integer,
        ByVal height As Integer,
        ByVal stride As Integer,
        ByVal quality_factor As Single,
        ByRef output As IntPtr
    ) As Integer

    ' 补全的WebPFree声明
    Private Declare Sub WebPFree Lib "libwebp.dll" (ByVal p As IntPtr)

    Public Sub SaveBitmapAsWebP(ByVal bmp As Bitmap, ByVal quality As Single, ByVal savePath As String)
        ' 确保Bitmap是BGRA格式(WebPEncodeBGRA要求的像素格式)
        Dim bgraBmp As Bitmap = If(bmp.PixelFormat = Imaging.PixelFormat.Format32bppArgb, 
                                  bmp, 
                                  bmp.Clone(New Rectangle(0, 0, bmp.Width, bmp.Height), Imaging.PixelFormat.Format32bppArgb))

        Dim data As Imaging.BitmapData = bgraBmp.LockBits(
            New Rectangle(0, 0, bgraBmp.Width, bgraBmp.Height),
            Imaging.ImageLockMode.ReadOnly,
            Imaging.PixelFormat.Format32bppArgb
        )

        Dim webpDataPtr As IntPtr = IntPtr.Zero
        Try
            ' 调用WebP编码函数,获取编码后数据的长度和内存指针
            Dim webpDataLength As Integer = WebPEncodeBGRA(
                data.Scan0,
                bgraBmp.Width,
                bgraBmp.Height,
                data.Stride,
                quality,
                webpDataPtr
            )

            ' 检查编码是否成功(返回长度为0表示失败)
            If webpDataLength <= 0 OrElse webpDataPtr = IntPtr.Zero Then
                Throw New Exception("WebP编码失败")
            End If

            ' 把内存中的WebP数据复制到字节数组
            Dim webpBytes(webpDataLength - 1) As Byte
            Marshal.Copy(webpDataPtr, webpBytes, 0, webpDataLength)

            ' 将字节数组写入磁盘文件
            File.WriteAllBytes(savePath, webpBytes)
        Finally
            ' 解锁Bitmap数据
            bgraBmp.UnlockBits(data)
            ' 如果使用了克隆的Bitmap,释放它
            If bgraBmp IsNot bmp Then
                bgraBmp.Dispose()
            End If
            ' 必须调用WebPFree释放libwebp分配的内存,避免泄漏
            If webpDataPtr <> IntPtr.Zero Then
                WebPFree(webpDataPtr)
            End If
        End Try
    End Sub
End Class

3. 关键注意事项

  • 像素格式匹配:WebPEncodeBGRA要求输入BGRA格式的像素数据(.NET的Format32bppArgb实际存储顺序就是BGRA),如果你的Bitmap不是这个格式,一定要先转换。
  • 内存释放:编码后webpDataPtr是libwebp在堆上分配的内存,必须调用WebPFree手动释放,否则会造成内存泄漏。
  • 质量参数:quality_factor取值范围是0(最差质量)到100(无损质量),可以根据需求灵活调整。

你直接调用SaveBitmapAsWebP方法,传入你的Bitmap、质量值和保存路径,就能完成WebP图片的保存啦!

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:22:25