У меня есть растровое изображение в памяти, которое передается в мою библиотеку из приложения C #. Мне нужно преобразовать его в лептонику Pix *, чтобы передать ее в тессеракт. И наоборот, мне нужно будет взять Pix * из порогового изображения и преобразовать его обратно в растровое изображение, чтобы вернуть его в приложение C #, но я еще не там. Вот мой код для перехода от растрового изображения к пикселю:
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, вместо того, чтобы заполняться растровыми данными. Я не сильно инвестирую в этот конкретный метод, если у кого-то есть рабочий метод, чтобы выполнить то, что я ищу.