ASP.NET libwebp.dll как сохранить образ WebP на диск - PullRequest
0 голосов
/ 28 апреля 2018

Я построил 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

Я получаю ошибку:

Была предпринята попытка загрузить программу с неверным форматом. (Исключение из HRESULT: 0x8007000B)

Что я тоже сделал (после комментариев от Дая ниже):

  • Я собрал dll для 64-битной архитектуры следующим образом: nmake /f Makefile.vc CFG=release-dynamic RTLIBCFG=dynamic OBJDIR=output ARCH=x64 ( также см. Здесь )
  • Я проверил IIS для рассматриваемого пула приложений, и для его свойства Enable32-Bit Applications установлено значение False
  • Я использую Windows 10 64 бит
  • И Environment.Is64BitProcess, и Environment.Is64BitOperatingSystem в коде позади оцениваются как True

Как я могу кодировать изображение и сохранить закодированное изображение на диск в формате WebP?

Для проверки на вашем компьютере :
Загрузите скомпилированный и zip libwebp.dll здесь . Это файл изображения, который я использую:

enter image description here

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Как я могу кодировать изображение и сохранить закодированное изображение на диск в формате 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

Кстати, команда nmake /f Makefile.vc CFG=release-dynamic RTLIBCFG=dynamic OBJDIR=output ARCH=x64, которую вы говорите, в порядке. Я также мог скомпилировать библиотеку (версия 1.0.0) с этой командой тоже. Однако я на 100% уверен, что zip libwebp.dll здесь является 32-битным, а не 64-битным.

Убедитесь, что вы запускаете правильную среду для создания 64-битных двоичных файлов.

0 голосов
/ 02 мая 2018

У меня также есть проблема с вашим образцом, поэтому я проверяю источники и, похоже, вы используете другой подход, чем в образце, не знаю почему.

так что я изменяю и выглядит это работает.

    <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

и импорт

Imports System.Runtime.InteropServices

Я использовал dll из файла libwebp-0.6.0.zip из Это инструкция 'libwebp-0.6.0.zip \ x64 \ bin' и все работает.

Когда я пытаюсь прикрепить вашу DLL из Загрузите скомпилированный и заархивированный libwebp.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")
...