【问题标题】:Return a Delphi-generated bitmap to (ASP).Net via COM object通过 COM 对象将 Delphi 生成的位图返回到 (ASP).Net
【发布时间】:2011-08-05 10:37:44
【问题描述】:

我们正在创建一个 Web 应用程序,它将在浏览器界面中将轮廓区域显示为位图。

我们已经有一个扩展的 Delphi 库,可以生成轮廓,并将它们绘制到 TCanvas 上。我们希望能够尽可能地重复使用该代码。

所以我们在 Delphi 中创建了一个 COM 对象,并使用它来生成轮廓。我在我的 ASP.Net 项目中添加了对该 COM 对象的引用,因此我可以从 .Net 代码中访问它。到目前为止,这似乎效果很好。

我现在遇到的问题是将生成的 TBitmap 尽快送到 ASP.Net 端。

我能想到一些场景,但我都遇到了问题:

  1. 将位图保存为流式传输(以 PNG 格式),并返回 IStream 接口。问题是 COM 对象向导似乎不接受 IStream 作为函数的返回值。另外,我不知道 .Net 是否会知道如何处理它,但我希望 Interop 包装器能够解决这个问题。

  2. 将位图保存为流式传输(以 PNG 格式),并返回一个字节数组。那我应该使用什么返回类型?我猜SAFEARRAY(byte)(至少向导接受了这一点),但是a)我如何在Delphi 端创建一个SAFEARRAY,以及b)我如何在.Net 中阅读那个

  3. 不知何故TBitmap 转换为IPicture 接口,然后返回。至少,IPicture 似乎受到 COM 对象向导的支持。在这里,我真的不知道如何将 TBitmap 转换为 IPicture(除了将其保存到流中,并从该流中创建 IPicture,这似乎有点愚蠢,因为 .Net 代码无论如何都必须将其流式传输到浏览器)。同样,我不知道.Net 将如何处理IPicture,尽管我希望它将它映射到一个常规的Image 对象,然后可以通过Response 对象写出。

    李>

所以我的问题是:就性能而言,最好的前进方式是什么?如何解决所指出的问题?

【问题讨论】:

    标签: .net delphi com bitmap com-interop


    【解决方案1】:

    您可以编写一个 Delphi COM 对象,它拥有位图并可以返回位图句柄。您可以从 TBitmap 获取此句柄并将其转换为 OLE_HANDLE。只要您持有对 COM 对象的引用,位图就有效。

    【讨论】:

    • 有趣。然后我可以将 Bitmap.FromHBitmap 与 OLE_HANDLE 一起使用吗?
    • 调用 ReleaseHandle 和转移所有权更容易
    • 根据 MSDN,Image.FromHbitmap() 实际上会复制图像。我从来没有尝试过,但可能你甚至不需要保留原始位图。
    • 不,那是错误的。文档并没有这样说,事实上,“但是,在 GDI+ 位图对象被删除或超出范围之前,您不应该删除 GDI 位图或 GDI 调色板。”这显然意味着 .net Bitmap 对象由原始 HBitmap 支持。 ReleaseHandle 后跟 Image.FromHbitmap 是要走的路。
    • 也许我错过了什么,但msdn.microsoft.com/en-us/library/k061we7x.aspx 的“备注”部分明确指出:FromHbitmap 方法复制了 GDI 位图;因此您可以在创建新图像后立即使用 GDI DeleteObject 方法释放传入的 GDI 位图。
    【解决方案2】:

    我会在原生世界和托管世界之间传递 HBITMAP。

    【讨论】:

    • 我正在尝试完成同样的事情,这将适用于进程内 COM,但不适用于进程外 COM。我还没有为进程外 COM 找到一个简单的解决方案。
    • @dschaeffer 你需要把图片序列化成字节流之类的
    猜你喜欢
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 2011-02-25
    • 2010-10-02
    • 1970-01-01
    相关资源
    最近更新 更多