ASP.NET libwebp.dll如何将WebP映像保存到磁盘

Flo*_*Flo 6 vb.net windows asp.net image webp

我是libwebp.dll为WebP 构建的,使用这些说明 (我下载了这个源代码)

我已将libwebp.dll文件添加到bin项目的文件夹中.

然后我添加了这段代码(在这里找到):

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
Private Declare Function WebPFree Lib "libwebp.dll" (ByVal p As IntPtr) As Integer

Private Sub Encode()
    Dim source As Bitmap = New Bitmap(Server.MapPath("images\") + "audio.png")
    Dim data As BitmapData = source.LockBits(New Rectangle(0, 0, source.Width, source.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
    Dim webp_data As IntPtr
    Dim i As Integer = WebPEncodeBGRA(data.Scan0, source.Width, source.Height, data.Stride, 80, webp_data)

    WebPFree(webp_data)
End Sub
Run Code Online (Sandbox Code Playgroud)

我收到错误:

尝试加载格式不正确的程序.(HRESULT异常:0x8007000B)

我也做了什么(在以下戴的评论之后):

  • 我内置了64位架构,像这样的DLL: nmake /f Makefile.vc CFG=release-dynamic RTLIBCFG=dynamic OBJDIR=output ARCH=x64(见这里)
  • 我检查了IIS的相关应用程序池,它的属性Enable32-Bit Applications设置为False
  • 我正在运行Windows 10 64位
  • 两者Environment.Is64BitProcessEnvironment.Is64BitOperatingSystem代码隐藏评估为True

如何编码图像并将编码图像以WebP格式保存到磁盘?

要在您的计算机上进行测试:
此处下载已编译和压缩的libwebp.dll.这是我正在使用的图像文件:

在此输入图像描述

Kul*_*gin 5

如何编码图像并将编码图像以WebP格式保存到磁盘?

转换过程之后,您需要编组非托管内存,以​​便可以使用托管代码中的数据.

Public Sub Encode()
    Dim source As Bitmap = New Bitmap(Server.MapPath("images\audio.png"))
    'Hold bitmap data
    Dim bmpData As BitmapData = source.LockBits(New Rectangle(0, 0, source.Width, source.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb)

    'Create a pointer for webp data
    Dim webpDataSrc As IntPtr

    'Store resulting webp data length after conversion
    Dim webpDataLen As Integer = WebPEncodeBGRA(bmpData.Scan0, source.Width, source.Height, bmpData.Stride, 80, webpDataSrc)

    'Create a managed byte array with the size you just have
    Dim webpDataBin As Byte() = New Byte(webpDataLen - 1){}

    'Copy from unmanaged memory to managed byte array you created
    System.Runtime.InteropServices.Marshal.Copy(webpDataSrc, webpDataBin, 0, webpDataLen)

    'Write byte array to a file
    System.IO.File.WriteAllBytes(Server.MapPath("images\audio.webp"), webpDataBin)

    'Free
    WebPFree(webpDataSrc)

    source.Dispose()
End Sub
Run Code Online (Sandbox Code Playgroud)

顺便nmake /f Makefile.vc CFG=release-dynamic RTLIBCFG=dynamic OBJDIR=output ARCH=x64说一下你说你用过的命令就行了.我也可以使用该命令编译库(版本1.0.0).但是我100%肯定压缩libwebp.dll这里是一个32位,而不是64位.

确保启动正确的环境以生成64位二进制文​​件.

  • @Flo没关系,但根本没有必要给我额外的赏金.谢谢. (2认同)

Nor*_*iak 4

我对你的样本也有问题,所以我检查了来源,看起来你使用了与样本中不同的方法,不知道为什么。

所以我改变了,看起来它有效。

    <DllImport("libwebp.dll", CallingConvention:=CallingConvention.Cdecl)>
Private Shared Function WebPEncodeBGRA(ByVal rgba As IntPtr, ByVal width As Integer, ByVal height As Integer, ByVal stride As Integer, ByVal quality_factor As Single, <Out> ByRef output As IntPtr) As Integer
End Function


<DllImport("libwebp.dll", CallingConvention:=CallingConvention.Cdecl)>
Private Shared Function WebPFree(ByVal p As IntPtr) As Integer
End Function
Run Code Online (Sandbox Code Playgroud)

并导入

Imports System.Runtime.InteropServices
Run Code Online (Sandbox Code Playgroud)

我已使用从此指令“libwebp-0.6.0.zip\x64\bin”下载 libwebp-0.6.0.zip 中的 dll, 并且它可以工作。

当我尝试从此处下载已编译和压缩的 libwebp.dll 附加您的 dll 时。这是我正在使用的图像文件:

得到完全相同的异常,看起来不是 64

对于图像我不确定,可能你需要反转它

            'data.strinde = webp_data 'not sure what is webp_data ewxacly, but you can check
        'data.Scan0 = webp_data 'not sure what is webp_data ewxacly, but you can check
        source.UnlockBits(data)
        source.Save(Server.MapPath("images\") + "audio.png")
Run Code Online (Sandbox Code Playgroud)