我正在使用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?这真的很烦人-___________- |
如果您正在使用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, ...) }