Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过COM对象将Delphi生成的位图返回到(ASP).Net_.net_Delphi_Com_Bitmap_Com Interop - Fatal编程技术网

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

通过COM对象将Delphi生成的位图返回到(ASP).Net,.net,delphi,com,bitmap,com-interop,.net,Delphi,Com,Bitmap,Com Interop,我们正在创建一个web应用程序,在浏览器界面中将等高线区域显示为位图 我们已经有了一个广泛的Delphi库,可以生成等高线,并可以将它们绘制到TCanvas上。我们希望能够尽可能地重复使用该代码 所以我们在Delphi中创建了一个COM对象,并使用它来生成轮廓。我在ASP.Net项目中添加了对该COM对象的引用,因此可以从.Net代码中访问它。到目前为止,这似乎效果不错 我现在遇到的问题是,尽可能快地将生成的TBitmap发送到ASP.Net端 我可以想到一些场景,但每种场景我都遇到了问题: 将

我们正在创建一个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)如何在.Net中读取它

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


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

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

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

    我会在本机和托管世界之间传递一个HBITMAP

    • 通过调用从Delphi
      TBitmap
      中分离句柄
    • 通过调用创建.net
      位图

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

    • 通过调用从Delphi
      TBitmap
      中分离句柄
    • 通过调用创建.net
      位图

    很有趣。然后我可以将Bitmap.FromHBitmap与OLE_句柄一起使用吗?只需调用ReleaseHandle并根据MSDN、Image转移所有权就更容易了。FromHBitmap()实际上会制作图像的副本。我从来没有尝试过这个,但也许你甚至不需要保留原始位图。不,那是错误的。文档中没有这样说,实际上是这样说的,“但是,在GDI+位图对象被删除或超出范围之前,不应该删除GDI位图或GDI调色板。”这显然意味着.net位图对象由原始HBitmap支持。ReleaseHandle后跟Image.FromHbitmap是一个不错的选择。也许我遗漏了一些东西,但的“备注”部分清楚地指出:FromHbitmap方法复制了GDI位图;因此,您可以在创建新图像后立即使用GDI DeleteObject方法释放传入的GDI位图。然后我可以将Bitmap.FromHBitmap与OLE_句柄一起使用吗?只需调用ReleaseHandle并根据MSDN、Image转移所有权就更容易了。FromHBitmap()实际上会制作图像的副本。我从来没有尝试过这个,但也许你甚至不需要保留原始位图。不,那是错误的。文档中没有这样说,实际上是这样说的,“但是,在GDI+位图对象被删除或超出范围之前,不应该删除GDI位图或GDI调色板。”这显然意味着.net位图对象由原始HBitmap支持。ReleaseHandle后跟Image.FromHbitmap是一个不错的选择。也许我遗漏了一些东西,但的“备注”部分清楚地指出:FromHbitmap方法复制了GDI位图;因此,您可以在创建新图像后立即使用GDI DeleteObject方法释放传入的GDI位图。我正在尝试完成同样的事情,这对于进程内COM很好,但对于进程外COM不起作用。对于进程外COM,我还没有找到一个简单的解决方案。@dschaefer您需要将映像序列化为字节流或其他类似的东西。我正在尝试完成相同的任务,这对进程内COM很好,但对进程外COM不起作用。我还没有找到进程外COM的简单解决方案。@dschaefer您需要将映像序列化为字节流或类似的格式