Я реализую функцию OCR и мне нужно использовать softwarebitmap для вызова функции, в случае, если у меня есть путь к файлу, нет проблем с созданием объекта softwarebitmap, но в некоторых случаях нет физического файла, и у меня есть win32 hbitmap, который можно преобразовать в буфер памяти, может ли кто-нибудь помочь мне преобразовать hbitmap или буфер памяти в softwarebitmap для вызова функции OCR.
std::future<hstring> AsyncSample(const std::wstring &path){
auto file = co_await StorageFile::GetFileFromPathAsync(path);
auto stream = co_await file.OpenAsync(FileAccessMode::Read);
auto decoder = co_await BitmapDecoder::CreateAsync(stream);
auto bitmap = co_await decoder.GetSoftwareBitmapAsync();
auto engine = OcrEngine::TryCreateFromUserProfileLanguages();
auto result = co_await engine.RecognizeAsync(bitmap);
return result.Text();}
Я нашел решение
winrt::Windows::Storage::Streams::IBuffer*
Conversion::CreateNativeBuffer(LPVOID lpBuffer, DWORD
nNumberOfBytes)
{
Microsoft::WRL::ComPtr<NativeBuffer> nativeBuffer;
Microsoft::WRL::Details::MakeAndInitialize<NativeBuffer>
(&nativeBuffer, (BYTE *)lpBuffer, nNumberOfBytes);
auto iinspectable = (IInspectable *)reinterpret_cast<IInspectable *>
(nativeBuffer.Get());
winrt::Windows::Storage::Streams::IBuffer *buffer =
reinterpret_cast<winrt::Windows::Storage::Streams::IBuffer *>(iinspectable);
return buffer;
}
и в основной функции
std::future<hstring> getTextFromBufferImage(CHAR *img, DWORD imgLength)
{
Conversion *tConv = new Conversion();
static Windows::Storage::Streams::IBuffer *stream;//::IBuffer *iBuffer;
stream = tConv->CreateNativeBuffer(img, imgLength);
SoftwareBitmap bitmap(BitmapPixelFormat::Rgba16, 30, 30);
bitmap.CopyFromBuffer(*stream);
auto engine = OcrEngine::TryCreateFromUserProfileLanguages();
auto result = co_await engine.RecognizeAsync(bitmap);
return result.Text();
}
Других решений пока нет …