c# - 来自另一个进程的 Marshal 位图

标签 c# .net marshalling unsafe abbyy

我有一个从另一个进程获得的位图句柄。不幸的是,我无法在此过程中更改代码,因为它是第三方 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); 获取位图,但是位图类抛出异常,消息为“GDI+ 中发生一般错误”。没有提供 InnerException。句柄似乎是正确的。

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

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

更新:

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

最佳答案

我是否正确理解您希望在使用 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。

关于c# - 来自另一个进程的 Marshal 位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17163345/

相关文章:

c# - 将 Windows 应用商店应用程序图像放入另一个程序集中?

.net - .NET 中的数组是否自然对齐?

java - 如何使用 JAXB 编码消除元素/属性中自动生成的命名空间前缀

c# - 是否可以在 ASP.NET 中直接写入/读取 TCP 流?

.net - dynamic-linq Select 中的字符串连接

c# - 从 C# : Of structs, 字符串和 wchar_t 数组调用 C++ dll 函数

java - 如何使用 JAXB 保留 XML 注释?

c# - 使用 C# 将 Blob 文件从 Azure 下载到内存流

c# - 关于C#构造函数的问题

c# 如何定义包含不同类型的字典?