当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《gdi+Graphics::DrawImage真的很慢~~》经验,为你挑选了1个好方法。

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

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

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

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

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

我不能使用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);

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

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



1> Cybis..:

如果您正在使用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, ...)
}

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有