Я пытаюсь получить текст в виде рисунка в 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) "