gdi + Graphics :: DrawImage真的很慢~~

use*_*749 17 performance gdi+ drawimage

我正在使用GDI + Graphic将4000*3000图像绘制到屏幕上,但它确实很慢.大约需要300毫秒.我希望它只占用不到10毫秒.

Bitmap *bitmap = Bitmap::FromFile("XXXX",...);
Run Code Online (Sandbox Code Playgroud)

// - - - - - - - - - - - - - - - - - - - - - - // 这部分需要大约300毫秒,太可怕了!

int width = bitmap->GetWidth();
int height = bitmap->GetHeight();
DrawImage(bitmap,0,0,width,height);
Run Code Online (Sandbox Code Playgroud)

// ------------------------------------------

我不能使用CachedBitmap,因为我想稍后编辑位图.

我怎样才能改进它?或者有什么不对吗?

这个原生GDI函数也将图像绘制到屏幕上,只需1毫秒:

SetStretchBltMode(hDC, COLORONCOLOR);   
StretchDIBits(hDC, rcDest.left, rcDest.top, 
        rcDest.right-rcDest.left, rcDest.bottom-rcDest.top, 
        0, 0, width, height,
        BYTE* dib, dibinfo, DIB_RGB_COLORS, SRCCOPY);
Run Code Online (Sandbox Code Playgroud)

// ------------------------------------------------ --------------

如果我想使用StretchDIBits,我需要传递BITMAPINFO,但是如何从Gdi + Bitmap对象获取BITMAPINFO?我通过FreeImage lib做了实验,我使用FreeImageplus对象调用StretchDIBits,它绘制得非常快.但是现在我需要绘制Bitmap,并在Bitmap的位数组上编写一些算法,如果我有Bitmap对象,如何获得BITMAPINFO?这真的很烦人-___________- |

Cyb*_*bis 15

如果您正在使用GDI +,那么TextureBrush类就是您快速渲染图像所需的类.我用它写了几个2D游戏,大约30 FPS左右.

我从来没有用C++编写.NET代码,所以这是一个C#-ish示例:

Bitmap bmp = new Bitmap(...)
TextureBrush myBrush = new TextureBrush(bmp)

private void Paint(object sender, PaintEventArgs e):
{
    //Don't draw the bitmap directly. 
    //Only draw TextureBrush inside the Paint event.
    e.Graphics.FillRectangle(myBrush, ...)
}
Run Code Online (Sandbox Code Playgroud)


Phi*_*Lho 6

您的屏幕分辨率为 4000 x 3000?哇!

如果没有,你应该只绘制图像的可见部分,它会快得多......

[第一条评论后编辑]我的评论确实有点愚蠢,我想 DrawImage 会屏蔽/跳过不需要的像素。

编辑后(显示 StretchDIBits),我猜速度差异的可能来源可能来自StretchDIBits是硬件加速的事实(“如果驱动程序无法支持 JPEG 或 PNG 文件图像”是一个提示......),而 DrawImage 可能(我没有证据证明这一点!)用 C 语言编写,依赖于 CPU 的能力而不是 GPU 的能力......

如果我没记错的话,DIB 图像速度很快(尽管是“设备无关”)。请参阅高速 Win32 动画:“使用 CreateDIBSection 进行高速动画”。好吧,它适用于旧 Windows 版本(1996!)中的 DIB 与 GDI,但我认为这仍然是正确的。

[编辑] 也许Bitmap::GetHBITMAP函数可能会帮助您使用 StretchDIBits (未测试...)。