Маршал Битмап из другого процесса
У меня есть дескриптор растрового изображения, который я получаю из другого процесса. К сожалению, я не могу изменить код в этом процессе, потому что это сторонний SDK (Abbyy Finereader SDK).
Я создаю FRDocument и пытаюсь получить дескриптор растрового изображения с помощью GetPicture из объекта Abbyy Image следующим образом:
FRDocument doc = engine.CreateFRDocumentFromImage(PATH_TO_SAMPLE_BITMAP);
FRPage page = doc.Pages[0];
FREngine.Image colorImage = page.ImageDocument.ColorImage;
long hbitmap = colorImage.GetPicture(null, 0);
IntPtr bitmapPtr = new IntPtr(hbitmap);
Bitmap bmp = Bitmap.FromHbitmap(bitmapPtr);
Теперь я хочу получить растровое изображение с Bitmap.FromHbitmap(hBitmap);
но класс Bitmap выдает исключение с сообщением "Общая ошибка произошла в GDI+". InnerException не предоставляется. Ручка кажется правильной.
В описании SDK описано, что он должен работать с маршаллингом, но больше информации или примеров кода не предоставлено. Я много гуглил, но я не эксперт по сортировке, и эта тема кажется очень сложной.
Кто-нибудь знает, как я могу получить растровое изображение из дескриптора, который был создан в другом процессе? Я надеюсь, что мой вопрос был понятен.
ОБНОВИТЬ:
Я провел некоторое исследование и обнаружил в описании Abbyy SDK, что растровое изображение, предоставляемое из GetPicture(), создается с помощью CreateDIBSection и передается в собственность клиентов. Но я не знаю, как получить растровое изображение, созданное с помощью этого (нативного) метода в C#.
1 ответ
Правильно ли я понимаю, что вы хотели бы выполнить некоторую внешнюю предварительную обработку вашего изображения, прежде чем распознавать его с помощью FineReader Engine? В этом случае сценарий может быть следующим:
// Create document
FREngine.FRDocument document = engineLoader.Engine.CreateFRDocument();
document.AddImageFile( imagePath, null, null );
// . . .
FREngine.ImageDocument imageDoc = document.Pages[pageNumber].ImageDocument;
IntPtr hBitmap = ( IntPtr )( imageDoc.ColorImage.GetPicture( null, 0 ) );
Bitmap bitmap = Bitmap.FromHbitmap( hBitmap );
// Perform manipulations with Bitmap object
// . . .
document.Close();
document = engineLoader.Engine.CreateFRDocument();
int manipulatedHBitmap = ( int )( bitmap.GetHbitmap() );
FREngine.ImageDocument imageDocument = engineLoader.Engine.OpenBitmapImage( manipulatedHBitmap, resolution );
document.AddImage( imageDocument );
// Perform image processing with the FineReader Engine
// . . .
Обратите внимание на то, что правильное значение разрешения должно быть передано методу OpenBitmapImage(), так как неправильное значение разрешения может снизить качество распознавания. Например, вы можете сохранить значение разрешения вашего исходного изображения, используя свойство imageDoc.ColorImage.XResolution.
Если у вас есть дополнительные вопросы, пожалуйста, свяжитесь с sdk_support@abbyy.com.