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

我正在使用GDI + Graphic来绘制一张4000 * 3000的图像来进行屏幕显示,但它确实很慢。 它大约需要300ms。 我希望它只占用不到10ms的时间。

Bitmap *bitmap = Bitmap::FromFile("XXXX",...);

// - - - - - - - - - - - - - - - - - - - - - - // 这部分需要约300ms,太可怕了!

int width = bitmap->GetWidth();
int height = bitmap->GetHeight();
DrawImage(bitmap,0,0,width,height);

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

我无法使用CachedBitmap,因为我想稍后编辑位图。

我该如何改进它? 或者有什么不对吗?

这种本地GDI功能也可以将图像绘制到屏幕上,并且只需要1 ms:

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);

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

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


你有一个4000×3000分辨率的屏幕? 哇!

如果不是,你应该只绘制图像的可见部分,它会更快......

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

编辑完成后(显示StretchDIBits),我猜测StretchDIBits是硬件加速(“如果驱动程序不支持JPEG或PNG文件图像”是一个提示...),而DrawImage可能会产生速度差异的可能来源是的(我没有证据证明这一点!)编码在C中,依靠CPU的力量而不是GPU的一个...

如果我记得正确,DIB图像很快(尽管是“独立于设备”)。 请参阅高速Win32动画:“使用CreateDIBSection执行高速动画”。 好吧,它适用于DIB与GDI,旧版Windows版(1996!),但我认为它仍然是正确的。

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


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

我从来没有用C ++写过.NET代码,所以这里有一个C#示例:

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, ...)
}

只是一个想法; 而不是在绘图之前检索图像的宽度和高度,为什么不在加载图像时缓存这些值?

链接地址: http://www.djcxy.com/p/50273.html

上一篇: gdi+ Graphics::DrawImage really slow~~

下一篇: VARCHAR(MAX) acting weird when concatenating string