最近做需求通过win32sdk编程从系统拿Icon图,发现有些程序是没有256标准的图,但是系统会给出其他规格的图,比如128/48/32,但是整体是一个256*256的白图,只不过有效图在左上角。大概是下图黑框这样,我需要区分出这个图是不是这样的,所以对Bitmap做了256规格的遍历,也很形象的让人理解图的像素分布
这里记录Bitmap像素的遍历方法
#include <GdiPlus.h>
#define EXTRALARGEICON_ITEM_WIDTH 256
bool IsIconSmall(Gdiplus::Bitmap* bmp) const
{
bool bSmall = true;
Gdiplus::Color color, checkColor(255, 0, 0, 0);
for (int x = 128+1; x != EXTRALARGEICON_ITEM_WIDTH; ++x)
{
for (int y = 128+1; y != EXTRALARGEICON_ITEM_HEIGHT; ++y)
{
bmp->GetPixel(x, y, &color);
if (color.GetValue() != checkColor.GetValue())
{
bSmall = false;
break;
}
}
if (bSmall == false)
{
break;
}
}
return bSmall;
}
void main()
{
ICONINFO ii = { 0 };
GetIconInfo(hIcon, &ii);
Gdiplus::Bitmap bmpIcon(ii.hbmColor, NULL);//GDI+
if (IsIconSmall(&bmpIcon))
{
}
else
{
}
DeleteObject(ii.hbmColor);
DeleteObject(ii.hbmMask);//这里不删除会有GDI泄露,原因是GetIconInfo时候会申请GDI句柄
}
GDI泄露单个windows进程上限是10000,GDI泄露严重就会有问题了
下面是GDI泄露的查看方法