Как создать BitmapDecoder и SoftwareBitmap с помощью vb.Net

Я пытаюсь получить текст фигуры рисунка в 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)» и «Асинхронное программирование с использованием Async и Await (Visual Basic)»

FWIW существует три способа извлечения графического изображения из Word: буфер обмена (то, что у вас есть), метод сохранения как изображения, извлечение изображения из WordOpenXML. Через буфер обмена, наверное, неплохо, потому что вы можете запрашивать информацию в нужном вам графическом формате. Обратите внимание, что если к Фигуре был добавлен текст, отредактировав его из в Word, вы можете извлечь этот текст непосредственно с помощью объектной модели.

Cindy Meister 01.05.2018 16:22

Привет, Синди, спасибо за помощь. Я внес некоторые изменения в вопрос. Моя текущая проблема, похоже, связана с созданием BitmapDecoder или SoftwareBitmap. Проблема связана не только с Word. Word - это всего лишь одна из возможных сред, в которой могут храниться данные растрового изображения, которые могут использоваться Ocr-Engine. Я знаком с офисной объектной моделью, создав приложения VSTO, но ничего не знаю о части UWP.

Oliver Brehm 01.05.2018 18:12
BitmapDecoder.CreateAsync() возвращает IAsyncOperation<BitmapDecoder>. Вы должны await CreateAsync() в контексте async (метод async).
Jimi 01.05.2018 20:06

Привет, Джими, спасибо за помощь. Я тоже думал о том, что это проблема. Я просто не мог найти источник, где я мог бы найти, как это сделать в VB.Net. Вы знаете что-нибудь или могли бы предоставить дополнительную информацию?

Oliver Brehm 02.05.2018 00:13

Что делать в VB? Асинхронный метод?

Jimi 02.05.2018 17:04

Да - когда я использую async, мне нужно много чего, чего я сейчас не понимаю. В C# это выглядит так просто ...

Oliver Brehm 02.05.2018 20:42

Асинхронные методы VB.Net и C# абсолютно одинаковы. Меняется только позиция объявления типа. C# => private async Task<int> MyMethodAsync() { return await SomeMethodWhichReturnsIntAsync(); } VB: Private Async Function MyMethodAsync() As Task(Of Integer) Return Await SomeMethodWhichReturnsIntAsync() End Function. Вы можете вызвать асинхронный метод из другого асинхронного метода, если вам нужно дождаться результатов, или использовать асинхронный метод прокси из неасинхронного метода для вызова асинхронного метода вашего рабочего (когда вы хотите запустить асинхронный процесс с запуском и забыть, потому что результатов ждать не нужно).

Jimi 02.05.2018 23:03

Извини, Джими - я не могу понять, как использовать эту информацию в моем случае. Я все еще не могу написать код, который создает объект BitmapDecoder, а затем объект SoftwareBitmap.

Oliver Brehm 13.05.2018 18:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
356
0

Другие вопросы по теме