Bitmap的遍历

最近做需求通过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泄露的查看方法

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值