都说 gdi+ 的 DrawImage() 函数效率太低,
下面是绕过 DrawImage 绘图的方法,
其余文件不变, 替换 main 函数即可.
------------------------------------------------------------
void main()
{
// gdi+ init
GdiplusStartupInput m_Gdistart;
ULONG_PTR m_GdiplusToken;
GdiplusStartup(&m_GdiplusToken,& m_Gdistart,NULL);
//////////////////////////////////////////////////
initgraph( 512, 512, SHOWCONSOLE );
IMAGE img;
loadimage(&img, "1player.jpg", 512, 512);// 加载image背景图
DWORD* pmem = GetImageBuffer(&img);// 获取缓存指针 一位数组 [400 * 400], 内存对齐方式排布,先水平
Bitmap* bitmap = Bitmap::FromFile(L"test.png");// GDI+ 内的函数, 读取 png
// 读取 bitmap 每个点的透明度,R,G,B值,赋值给 pmem
Color color;
for ( int i = 0; i < 512; i++ )
{
for ( int j = 0; j < 512; j++ )
{
bitmap->GetPixel(j, i, &color);
// 这里不能设置 pmem 的 Alpha 值, 所以不能实现半透明-----------
// 只将透明度大于 180 的点复制到 pmem 内, 其余不复制,即透明.( 不一定是 180,可自行设定)
if ( color.GetA() > 180 )
pmem[i* 512 + j] = RGB(color.GetB(), color.GetG(), color.GetR());// pmem 的 RGB 是反的 BGR
}
}
putimage(0, 0, &img);// 将 image 输出到主窗口
getch();
GdiplusShutdown(m_GdiplusToken);// 释放gdi+资源
closegraph();
}