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
相关产品推荐
相关产品推荐

