将 win32 hbitmap 转换为 winrt softwarebitmap
Convert win32 hbitmap to winrt softwarebitmap
我正在实现 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();
}
我正在实现 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();
}