将System :: Drawing :: Bitmap ^转换为Pix *(leptonica)

时间:2018-11-15 14:27:13

标签: visual-c++ c++-cli leptonica

我的内存中有一个位图,它从C#应用程序传递到我的库中。我需要将其转换为leptonica Pix *,以将其传递到tesseract。相反,我将不得不从阈值图像中提取Pix *,并将其转换回Bitmap,以将其返回给C#应用程序,但我还没有。这是我从位图到Pix的代码:

Pix* OcrProcessor::ToPix(Bitmap^ bitmap)
{
    const auto rect = new Drawing::Rectangle(0, 0, bitmap->Width, bitmap->Height);
    const auto bitmap_data = bitmap->LockBits(*rect, ImageLockMode::ReadOnly, bitmap->PixelFormat);
    auto ptr = bitmap_data->Scan0;
    const auto bytes = Math::Abs(bitmap_data->Stride) * bitmap->Height;
    const auto rgb_values = gcnew array<unsigned char>(bytes);
    Marshal::Copy(ptr, rgb_values, 0, bytes);
    auto handle = GCHandle::Alloc(rgb_values, GCHandleType::Pinned);
    const auto data = static_cast<unsigned char*>(static_cast<void*>(handle.AddrOfPinnedObject()));
    const auto converted = pixReadMemBmp(data, bytes);
    bitmap->UnlockBits(bitmap_data);
    delete rect;
    return converted;
}

转换后的Pix *始终为空。逐步执行代码,rgb_values始终是一个填充有255的数组,而不是填充有位图数据。如果有人有可行的方法来实现我想要的功能,我不会在这种特定方法上投入大量资金。

0 个答案:

没有答案