我们正在创建一个 Web 应用程序,它将在浏览器界面中将轮廓区域显示为位图。
我们已经拥有一个丰富的 Delphi 库,可以生成轮廓,并将它们绘制到 TCanvas 上。我们希望能够尽可能地重复使用该代码。
因此,我们在 Delphi 中创建了一个 COM 对象,并使用它来生成轮廓。我已在 ASP.Net 项目中添加了对该 COM 对象的引用,因此我可以从 .Net 代码访问它。到目前为止,这似乎效果很好。
我现在遇到的问题是尽快将生成的 TBitmap 发送到 ASP.Net 端。
我可以想到一些场景,但我在每个场景上都遇到了问题:
将位图保存到流(作为 PNG),并返回
IStream
接口(interface)。问题是 COM 对象向导似乎不接受 IStream 作为函数的返回值。另外,我不知道 .Net 是否知道如何处理它,但我希望 Interop 包装器能够解决这个问题。将位图保存到流(作为 PNG),并返回字节数组。那我应该使用什么返回类型呢?我猜测
SAFEARRAY(byte)
(向导至少接受这一点),但是 a) 如何在 Delphi 端创建 SAFEARRAY,以及 b) 如何读取该内容 在 .Net 中?以某种方式将
TBitmap
转换为IPicture
接口(interface),然后返回。至少,IPicture 似乎受到 COM 对象向导的支持。在这里,我真的不知道如何将 TBitmap 转换为 IPicture(除了将其保存到流中,并从该流创建 IPicture,这似乎有点愚蠢,因为 .Net 代码无论如何都必须将其流式传输到浏览器) )。同样,我不知道 .Net 将如何处理IPicture
,尽管我希望它将它映射到常规Image
对象,然后可以通过响应
对象。
所以我的问题是:就性能而言,前进的最佳方式是什么,以及如何解决所指出的问题?
最佳答案
我会在 native 世界和托管世界之间传递 HBITMAP。
- 通过调用
ReleaseHandle
将句柄与 DelphiTBitmap
分离. - 通过调用
Image.FromHbitmap()
创建 .net位图
.
关于.net - 通过 COM 对象将 Delphi 生成的位图返回到 (ASP).Net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5662011/