我的内存中有一个位图,它从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的数组,而不是填充有位图数据。如果有人有可行的方法来实现我想要的功能,我不会在这种特定方法上投入大量资金。