通过COM对象将Delphi生成的位图返回到(ASP).Net

时间:2011-04-14 10:43:01

标签: .net delphi com bitmap com-interop

我们正在创建一个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)如何读取中的。净

  3. 以某种方式TBitmap转换为IPicture界面,然后返回。至少,IPicture似乎得到了COM对象向导的支持。在这里,我真的不知道如何将TBitmap转换为IPicture(除了将其保存为流,并从该流创建IPicture,这似乎有点傻,因为.Net代码必须将其流式传输到浏览器)。同样,我不知道.Net将如何处理IPicture,但我希望它将它映射到常规Image对象,然后可以通过Response对象写出来。

  4. 所以我的问题是:在表现方面,如何解决所指出的问题,最好的方法是什么?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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