我们正在创建一个Web应用程序,它将在浏览器界面中将轮廓区域显示为位图。
我们已经有了一个可以生成轮廓的扩展Delphi库,并且可以将它们绘制到TCanvas上。我们希望能够尽可能地重复使用该代码。
所以我们在Delphi中创建了一个COM对象,并用它来生成轮廓。我在ASP.Net项目中添加了对该COM对象的引用,因此我可以从.Net代码访问它。到目前为止,这似乎很好。
我现在遇到的问题是,尽可能快地将生成的TBitmap提供给ASP.Net方面。
我可以想到一些场景,但我遇到了各自的问题:
将位图保存为流(作为PNG),并返回IStream
界面。问题是COM对象向导似乎不接受IStream
作为函数的返回值。此外,我不知道.Net是否会知道如何处理它,但我希望Interop包装器能够解决这个问题。
将位图保存为流(作为PNG),并返回一个字节数组。那我应该使用什么返回类型?我猜SAFEARRAY(byte)
(向导接受,至少),但a)如何在Delphi端创建SAFEARRAY,以及b)如何读取中的。净
以某种方式将TBitmap
转换为IPicture
界面,然后返回。至少,IPicture似乎得到了COM对象向导的支持。在这里,我真的不知道如何将TBitmap转换为IPicture(除了将其保存为流,并从该流创建IPicture,这似乎有点傻,因为.Net代码必须将其流式传输到浏览器)。同样,我不知道.Net将如何处理IPicture
,但我希望它将它映射到常规Image
对象,然后可以通过Response
对象写出来。
所以我的问题是:在表现方面,如何解决所指出的问题,最好的方法是什么?
答案 0 :(得分:3)
我会在原生世界和托管世界之间传递HBITMAP。
ReleaseHandle
。TBitmap
中删除句柄
Image.FromHbitmap()
创建.net Bitmap
。答案 1 :(得分:2)
你可以写一个Delphi COM对象,它拥有位图并可以返回一个位图句柄。您可以从TBitmap获取此句柄并将其转换为OLE_HANDLE。只要您持有对COM对象的引用,位图就是有效的。