永发信息网

如何将Icon转成Bitmap

答案:1  悬赏:20  手机版
解决时间 2021-03-19 18:34
如何将Icon转成Bitmap
最佳答案
HBITMAP IconToBitmap(HICON hIcon, SIZE* pTargetSize = NULL)
{
ICONINFO info = {0};
if(hIcon == NULL
|| !GetIconInfo(hIcon, &info)
|| !info.fIcon)
{
return NULL;
}

INT nWidth = 0;
INT nHeight = 0;
if(pTargetSize != NULL)
{
nWidth = pTargetSize->cx;
nHeight = pTargetSize->cy;
}
else
{
if(info.hbmColor != NULL)
{
BITMAP bmp = {0};
GetObject(info.hbmColor, sizeof(bmp), &bmp);

nWidth = bmp.bmWidth;
nHeight = bmp.bmHeight;
}
}

if(info.hbmColor != NULL)
{
DeleteObject(info.hbmColor);
info.hbmColor = NULL;
}

if(info.hbmMask != NULL)
{
DeleteObject(info.hbmMask);
info.hbmMask = NULL;
}

if(nWidth <= 0
|| nHeight <= 0)
{
return NULL;
}

INT nPixelCount = nWidth * nHeight;

HDC dc = GetDC(NULL);
INT* pData = NULL;
HDC dcMem = NULL;
HBITMAP hBmpOld = NULL;
bool* pOpaque = NULL;
HBITMAP dib = NULL;
BOOL bSuccess = FALSE;

do
{
BITMAPINFOHEADER bi = {0};
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = nWidth;
bi.biHeight = -nHeight;
bi.biPlanes = 1;
bi.biBitCount = 32;
bi.biCompression = BI_RGB;
dib = CreateDIBSection(dc, (BITMAPINFO*)&bi, DIB_RGB_COLORS, (VOID**)&pData, NULL, 0);
if(dib == NULL) break;

memset(pData, 0, nPixelCount * 4);

dcMem = CreateCompatibleDC(dc);
if(dcMem == NULL) break;

hBmpOld = (HBITMAP)SelectObject(dcMem, dib);
::DrawIconEx(dcMem, 0, 0, hIcon, nWidth, nHeight, 0, NULL, DI_MASK);

pOpaque = new(std::nothrow) bool[nPixelCount];
if(pOpaque == NULL) break;
for (INT i = 0; i < nPixelCount; ++i)
{
pOpaque[i] = !pData[i];
}

memset(pData, 0, nPixelCount * 4);
::DrawIconEx(dcMem, 0, 0, hIcon, nWidth, nHeight, 0, NULL, DI_NORMAL);

BOOL bPixelHasAlpha = FALSE;
UINT* pPixel = (UINT*)pData;
for(INT i = 0; i<nPixelCount; ++i, ++pPixel)
{
if((*pPixel & 0xff000000) != 0)
{
bPixelHasAlpha = TRUE;
break;
}
}

if(!bPixelHasAlpha)
{
pPixel = (UINT*)pData;
for(INT i=0;i <nPixelCount; ++i, ++pPixel)
{
if(pOpaque[i])
{
*pPixel |= 0xFF000000;
}
else
{
*pPixel &= 0x00FFFFFF;
}
}
}

bSuccess = TRUE;

} while(FALSE);

if(pOpaque != NULL)
{
delete []pOpaque;
pOpaque = NULL;
}

if(dcMem != NULL)
{
SelectObject(dcMem, hBmpOld);
DeleteDC(dcMem);
}

ReleaseDC(NULL, dc);

if(!bSuccess)
{
if(dib != NULL)
{
DeleteObject(dib);
dib = NULL;
}
}

return dib;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
用建设银行向中国银行电子现金圈冲了200怎么
专属天使 歌词
电厂老酸汤南白旗舰店怎么去啊,有知道地址的
起名姓范名思宇的含义是什么?
齿轮渗碳后拋丸和喷丸有区別吗
特种高空吊机,200米楼顶吊机 吊6吨, 专业生
有不含甲醛的壁纸吗
银行贷款需要哪些手续
一首日文歌里的歌词"夕阳染红了晚霞"这句歌词
交通事故中,右侧颞骨凹陷性骨折,右顶骨骨折
西多一横和廖少广字头是什么字?
巅峰指秀地址有知道的么?有点事想过去
在济南请个家教大概多少钱?
什么样的女人才能与其结婚
LG洗衣机的售后维修太差了!抽水电机坏了说没
推荐资讯
中国移动车站指定专营店这个地址在什么地方,
明天打算去广州玩,特别想去大学看看。大学可
苏泊尔电压力锅安全阀漏气正常吗
吉林省广超牧业有限公司这个地址在什么地方,
从小恨父亲的女孩有怎样的性格特征?
隆力奇五行养生馆地址在哪,我要去那里办事
绝味鸭脖火车站店在什么地方啊,我要过去处理
北京30平米超小户型,家装设计需要多少钱
SEVERE: Servlet.service() for servlet [jsp
普吉岛有粥吗?胃口不好 出去旅游回来后 准备
坐月子可以外出吗
武汉精武鸭脖(雷南店)这个地址在什么地方,我
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?