将 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();
}