ASP.NET libwebp.dll как сохранить образ 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
Я получаю ошибку:
Была предпринята попытка загрузить программу с неверным форматом. (Исключение из 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?
Чтобы проверить на вашей машине:
Загрузите скомпилированный и заархивированный libwebp.dll здесь. Это файл изображения, который я использую:
2 ответа
У меня также есть проблема с вашим образцом, поэтому я проверяю источники и похоже, что вы используете другой подход, чем в образце, не знаю почему.
так что я меняюсь и выглядит это работает.
<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 из Загрузите скомпилированный и ZIP-архив 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")
Как я могу закодировать изображение и сохранить закодированное изображение на диск в формате 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-битных двоичных файлов.