C# 从另一个进程封送位图

C# 从另一个进程封送位图,c#,.net,marshalling,unsafe,abbyy,C#,.net,Marshalling,Unsafe,Abbyy,我有一个位图句柄,是从另一个进程得到的。不幸的是,我不能在这个过程中更改代码,因为它是第三方SDK(Abbyy Finereader SDK) 我创建了一个FRDocument,并尝试从Abbyy Image对象中使用GetPicture获取位图句柄,如下所示: FRDocument doc = engine.CreateFRDocumentFromImage(PATH_TO_SAMPLE_BITMAP); FRPage page = doc.Pages[0];

我有一个位图句柄,是从另一个进程得到的。不幸的是,我不能在这个过程中更改代码,因为它是第三方SDK(Abbyy Finereader SDK)

我创建了一个FRDocument,并尝试从Abbyy Image对象中使用GetPicture获取位图句柄,如下所示:

        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)获得一个位图但位图类引发异常,并显示消息“GDI+中发生一般错误”。未提供InnerException。手柄似乎是正确的

SDK描述中描述了它应该与编组一起工作,但没有提供更多信息或代码示例。我在谷歌上搜索过很多次,但我不是编组专家,而且这个话题似乎非常复杂

有人知道如何从另一个进程中创建的句柄获取位图吗? 我希望我的问题是可以理解的

更新:


我做了一些研究,发现在Abbyy SDK描述中,GetPicture()提供的位图是使用CreateDIBSection创建的,并在客户机所有权下传递。但是我不知道如何获取在C#中使用此(本机)方法创建的位图。

我是否正确理解,在使用FineReader引擎识别图像之前,您希望对图像执行一些外部预处理? 在这种情况下,情况可能如下:

// 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.

我感觉到了你的痛苦。抛出该特定错误消息的原因有很多。列出一些(希望有帮助):图像太大了。图像被处理。图像具有奇怪的像素格式。您的进程违反了安全权限。此外。。您能告诉我们您是如何设置
hBitmap
变量的值的吗?谢谢您的回答。我想可以排除图像太大或已处理的情况,因为如果我在进程中加载第三方SDK(我无法在生产环境中使用该SDK,因为它会阻塞我的GUI),位图的创建不会出现问题。我认为您关于进程安全权限的提示可能是正确的,但我真的不知道如何解决此问题。更新了我的答案。我从Abbyy Finereader SDK获得了hBitmap。如果没有访问他们的API(在简单的谷歌搜索后似乎无法免费获得),我认为没有人能够帮助你。谢谢你的回答。是的,你完全正确地理解了我。我已经这样试过了。当我使用位图Bitmap=Bitmap.FromHbitmap(hBitmap);,时,System.Drawing中出现异常;。异常仅表示“GDI+中发生了一般性错误”,如上所述。我用的正是你的密码。我使用OutproceEngineLoader。