Как создать BitmapDecoder и SoftwareBitmap с помощью vb.Net? - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь получить текст в виде рисунка в Microsoft Word. Для этого я использую библиотеку OCR, которая включена в Windows 10 windows.media.ocr. Поскольку OCREngine нужен SoftwareBitmap, с которым я еще не работал, я попробовал следующий подход, чтобы добраться до SoftwareBitmap:

  oWordDocument.Shapes(1).Select() '*** Get shape and copy to clipboard and then to bitmap
  oWordApp.Selection.CopyAsPicture()
  Dim oBitmap As System.Drawing.Bitmap = New System.Drawing.Bitmap(System.Windows.Forms.Clipboard.GetImage())

  Dim oSoftwareBitmap As Windows.Graphics.Imaging.SoftwareBitmap
  Dim oUWPStream As Windows.Storage.Streams.IRandomAccessStream

  Using oNetStream As New System.IO.MemoryStream '*** Get UWP-Stream via .Net-Stream
        oBitmap.Save(oNetStream, System.Drawing.Imaging.ImageFormat.Png)
        oUWPStream = System.IO.WindowsRuntimeStreamExtensions.AsRandomAccessStream(oNetStream)

        '*** in the following line an invalidcast error occurs "Unable to cast object of type 'System.__ComObject' to type 'Windows.Graphics.Imaging.BitmapDecoder'."
        Dim oBitmapDecoder As Windows.Graphics.Imaging.BitmapDecoder = Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(Windows.Graphics.Imaging.BitmapDecoder.PngDecoderId, oUWPStream)
        oSoftwareBitmap = oBitmapDecoder.GetSoftwareBitmapAsync()
  End Using

Так что сейчас код работает нормально, пока я не попытаюсь создать BitmapDecoder. Из того, что я вижу, я предоставляю допустимый RandomAccessStream, но создание завершается неудачно с недействительным.

Может кто-нибудь помочь с этим или даже предоставить или указать мне пример кода для создания BitmapDecoder и SoftwareBitmap?

Извините, если описание сложное или запутанное - английский не мой родной язык

Проблема решена: На самом деле решение было довольно простым. Я просто не понял этого в первый раз. С самого начала я знал, что должен был использовать await с асинхронными методами, но всегда сталкивался с не очень полезными сообщениями об ошибках визуального редактора. И это было просто из-за отсутствующего асинхронного контекста. После того, как я добавил ключевое слово async в свой обработчик событий Private Async Sub SelectFilesButton_Click(sender As Object, e As EventArgs) Handles SelectFilesButton.Click, все прошло нормально, и я мог использовать оператор await, как и ожидалось.

Вот окончательное решение, соответствующее приведенному выше коду:

'*** Get Bitmap from Word Bitmap-Shape
oWordDocument.Shapes(1).Select()
oWordApp.Selection.CopyAsPicture()
Dim oBitmap As System.Drawing.Bitmap = New System.Drawing.Bitmap(System.Windows.Forms.Clipboard.GetImage())

'*** Convert Streams, get BitmapDecoder + SoftwareBitmap
Using oNetStream As New System.IO.MemoryStream
    oBitmap.Save(oNetStream, System.Drawing.Imaging.ImageFormat.Png)
    Dim oUWPStream As Windows.Storage.Streams.IRandomAccessStream = System.IO.WindowsRuntimeStreamExtensions.AsRandomAccessStream(oNetStream)
    Dim oBitmapDecoder As Windows.Graphics.Imaging.BitmapDecoder = Await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(oUWPStream)
    Dim oSoftwareBitmap As Windows.Graphics.Imaging.SoftwareBitmap = Await oBitmapDecoder.GetSoftwareBitmapAsync()
End Using

Спасибо, Джими, за то, что направил меня в правильном направлении - извините, что потратил на меня столько времени, чтобы понять

PS: Очень полезно понять, что это были 2 статьи из руководств по программированию Microsoft, которые можно найти, используя следующие условия поиска: « Поток управления в асинхронных программах (Visual Basic) » и " Асинхронное программирование с асинхронным и ожидающим (Visual Basic) "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...