我想画一个相同大小的HDC.我正在使用:des和src的大小相同.
::StretchDIBits(hdc,
des.left,des.top,des.right - des.left,des.bottom - des.top,
src.left, GetHeight() - src.bottom, src.right - src.left,src.bottom - src.top,
m_pImg->accessPixels(),m_pImg->getInfo(), DIB_RGB_COLORS, SRCCOPY);
Run Code Online (Sandbox Code Playgroud)
但我发现它很慢,因为des尺寸相同,我只需要将dib复制到dc上.有没有比StretchDIBits更快的方法?
就像
StretchBlt (slow) vs Bitblt.(faster)
StretchDIBits (slow ) vs ?(faster)
Run Code Online (Sandbox Code Playgroud) (这与如何使用Win32/GDI加载PNG图像的问题有关(如果可能,没有GDI +)?)
大家好,
我想知道,鉴于你有一个PNG资源嵌入带有ID的二进制文件中IDB_PNG1
,并且LPDRAWITEMSTRUCT
要绘制(这意味着你有HDC
目标的矩形和矩形),你如何使用这个图像绘制到屏幕上StretchDIBits
?我曾经BitBlt
和TransparentBlt
以前StretchDIBits
一起工作,但似乎工作方式不同,LoadImage
似乎不适用于PNG.
谢谢!
(注意:我使用的语言是C++,但这并不太重要...... C,C#,Visual Basic等都没问题;我只是想弄清楚步骤,而不是确切的代码.)
我计时了一个使用多个StretchBlt
和StretchDIBits
调用的DDB绘图操作.
我发现,完成时间与目标窗口大小成比例地增加/减少.
使用900x600窗口需要大约5ms,但是对于1920x1080,它需要大约55ms(源图像是1280x640).
看来Stretch .. API不使用任何硬件加速功能.
创建源图像(实际上这是临时绘图画布)CreateDIBSection
因为我需要为绘制的每个帧生成(拉伸和合并)位图的像素数据.
让我们假设,Windows GDI是没有希望的.那么有希望的替代方案是什么?
我考虑使用WIC方法的D3D,D2D(写入WIC位图并使用D2D绘制它然后从WIC位图读回像素数据).
我计划用WIC方法尝试D2D,因为我需要很快使用大量的文本绘图功能.
但似乎WIC并不那么有希望:WIC位图处理最有效的像素格式是什么?
我正在使用StretchDIBits
打印图像,当图像由于某种未知原因而处于特定大小时,它会失败.
图像数据从24位BGR格式的某些其他图像源加载到unsigned int数组中.我已经验证了图像和缓冲区完全没问题,因为就像我说的那样,它可以在某些尺寸上工作但根本不工作.
我正在测试的当前尺寸是638x1014.如果我将高度更改为1013它可以正常工作,但由于某种原因,如果它是1014,它就会失败.
这里有一些代码向您展示如何设置它们:
unsigned int * buffer = new unsigned int[width * height * 3];
// Fill buffer with image data...
BITMAPINFOHEADER bi = { 0 };
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = width;
bi.biHeight = height;
bi.biPlanes = 1;
bi.biBitCount = 24;
bi.biCompression = BI_RGB;
bi.biSizeImage = width * height * 3; // Specifying this value because if I don't it will crash trying to read outside of the buffer.
StartPage(hdcPrint);
SetMapMode(hdcPrint, MM_ISOTROPIC);
SetWindowExtEx(hdcPrint, width, height, …
Run Code Online (Sandbox Code Playgroud)