【问题标题】:Copy Small Bitmaps on to Large Bitmap with Transparency Blend: What is faster than graphics.DrawImage(smallBitmap, x , y)?使用透明混合将小位图复制到大位图:什么比 graphics.DrawImage(smallBitmap, x , y) 更快?
【发布时间】:2010-03-19 05:50:46
【问题描述】:

我已将此调用确定为高压函数中的瓶颈。

graphics.DrawImage(smallBitmap, x , y);

有没有一种更快的方法可以将小的半透明位图混合成较大的半透明位图?

示例用法:

XY[] locations = GetLocs();
     Bitmap[] bitmaps = GetBmps(); //small images sizes vary approx 30px x 30px

        using (Bitmap large = new Bitmap(500, 500, PixelFormat.Format32bppPArgb))
        using (Graphics largeGraphics = Graphics.FromImage(large))
        {
          for(var i=0; i < largeNumber; i++)
          {
            //this is the bottleneck
            largeGraphics.DrawImage(bitmaps[i], locations[i].x , locations[i].y); 
         }
       }

       var done = new MemoryStream(); 
       large.Save(done, ImageFormat.Png); 
       done.Position = 0;
       return (done);

DrawImage 调用采用一个小的 32bppPArgb 位图并将它们复制到一个较大的位图中,这些位图的位置各不相同,并且小位图可能仅与较大的位图可见区域部分重叠。两个图像都有半透明的内容,这些内容由 DrawImage 以对输出很重要的方式混合。我已经使用 BitBlt 进行了一些测试,但没有看到显着的速度改进,并且 alpha 混合在我的测试中并没有出现相同的结果。我对任何方法都持开放态度,包括更好地调用 bitblt 或不安全的 c# 代码。

【问题讨论】:

  • 我实际上不这么认为(如果不使用硬件加速,也许 DirectX 可以帮助你)。我一直在玩弄类似的问题。我发现当我将半透明图像绘制到 opaque 图像上时,我可以在汇编程序中编写更快的 DrawImage,因为那时我可以作弊一点,但否则不行。
  • 我害怕那个。我认为 DirectX 可能不适合我,因为代码在 Web 服务器上运行。您是否尝试在不安全的 int 数组上使用按位运算符进行混合?这是我正在考虑尝试的一件事,但是设置它以使用我的用例进行测试将是一项相当大的工作,如果您尝试过,我很乐意避免构建该测试用例。感谢您的反馈。
  • Dan,经过一些测试,我认为您是对的。如果您在下面发表评论作为答案,我会将其标记为已接受。

标签: c# graphics image-processing unsafe bitblt


【解决方案1】:

经过一些测试,我发现 Dan 是对的(参见上面的 cmets)。如果您不需要它提供的所有混合功能,则可以击败 GDI Draw Image 性能,但在透明度混合的情况下,我认为没有材料改进的空间。

【讨论】:

    猜你喜欢
    • 2010-10-13
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    相关资源
    最近更新 更多