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)
您的屏幕分辨率为 4000 x 3000?哇!
如果没有,你应该只绘制图像的可见部分,它会快得多......
[第一条评论后编辑]我的评论确实有点愚蠢,我想 DrawImage 会屏蔽/跳过不需要的像素。
编辑后(显示 StretchDIBits),我猜速度差异的可能来源可能来自StretchDIBits是硬件加速的事实(“如果驱动程序无法支持 JPEG 或 PNG 文件图像”是一个提示......),而 DrawImage 可能(我没有证据证明这一点!)用 C 语言编写,依赖于 CPU 的能力而不是 GPU 的能力......
如果我没记错的话,DIB 图像速度很快(尽管是“设备无关”)。请参阅高速 Win32 动画:“使用 CreateDIBSection 进行高速动画”。好吧,它适用于旧 Windows 版本(1996!)中的 DIB 与 GDI,但我认为这仍然是正确的。
[编辑] 也许Bitmap::GetHBITMAP函数可能会帮助您使用 StretchDIBits (未测试...)。
| 归档时间: |
|
| 查看次数: |
21873 次 |
| 最近记录: |