HBITMAP IconToBitmap(HICON hIcon, SIZE* pTargetSize = NULL)
{
ICONINFO info = {};
if(hIcon == NULL
|| !GetIconInfo(hIcon, &info)
|| !info.fIcon)
{
return NULL;
} INT nWidth = ;
INT nHeight = ;
if(pTargetSize != NULL)
{
nWidth = pTargetSize->cx;
nHeight = pTargetSize->cy;
}
else
{
if(info.hbmColor != NULL)
{
BITMAP bmp = {};
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 <=
|| nHeight <= )
{
return NULL;
} INT nPixelCount = nWidth * nHeight; CDC* pDC = GetDC();
HDC dc = pDC->GetSafeHdc();
INT* pData = NULL;
HDC dcMem = NULL;
HBITMAP hBmpOld = NULL;
bool* pOpaque = NULL;
HBITMAP dib = NULL;
BOOL bSuccess = FALSE; do
{
BITMAPINFOHEADER bi = {};
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = nWidth;
bi.biHeight = -nHeight;
bi.biPlanes = ;
bi.biBitCount = ;
bi.biCompression = BI_RGB;
dib = CreateDIBSection(dc, (BITMAPINFO*)&bi, DIB_RGB_COLORS, (VOID**)&pData, NULL, );
if(dib == NULL) break; memset(pData, , nPixelCount * ); dcMem = CreateCompatibleDC(dc);
if(dcMem == NULL) break; hBmpOld = (HBITMAP)SelectObject(dcMem, dib);
::DrawIconEx(dcMem, , , hIcon, nWidth, nHeight, , NULL, DI_MASK); //pOpaque = new(std::nothrow) bool[nPixelCount];
pOpaque = new bool[nPixelCount];
if(pOpaque == NULL) break;
for (INT i = ; i < nPixelCount; ++i)
{
pOpaque[i] = !pData[i];
} memset(pData, , nPixelCount * );
::DrawIconEx(dcMem, , , hIcon, nWidth, nHeight, , NULL, DI_NORMAL); BOOL bPixelHasAlpha = FALSE;
UINT* pPixel = (UINT*)pData;
for(INT i = ; i<nPixelCount; ++i, ++pPixel)
{
if((*pPixel & 0xff000000) != )
{
bPixelHasAlpha = TRUE;
break;
}
} if(!bPixelHasAlpha)
{
pPixel = (UINT*)pData;
for(INT i=;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(pDC); if(!bSuccess)
{
if(dib != NULL)
{
DeleteObject(dib);
dib = NULL;
}
} return dib;
}

Icon 转 Bitmap的更多相关文章

  1. 如何将Icon转成Bitmap

    最近工作中有个需求是将Icon转成带Alpha通道的Bitmap, 虽然网上有不少这方面的文章,但很多都是错的, 这里记录下,或许对后来人有用. 要实现这个功能,我们首先需要理解Icon的格式,我们可 ...

  2. 如何将Icon转成Bitmap(对ICON的内部格式讲的比较清楚)

    最近工作中有个需求是将Icon转成带Alpha通道的Bitmap, 虽然网上有不少这方面的文章,但很多都是错的, 这里记录下,或许对后来人有用.   要实现这个功能,我们首先需要理解Icon的格式,我 ...

  3. 简单谈谈Resource,Drawable和Bitmap之间的转换

    一直接触这些东西,还是归个类整理一下比较好. Resource -> Drawable Drawable draw1 = this.getResources().getDrawable(R.dr ...

  4. VB6 GDI+ 入门教程[8] Bitmap魔法(1):创建

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[8] Bitmap魔法(1):创建 2009 年 9 月 ...

  5. android在假设绘制自己定义的bitmap,然后返回给ImageView

    先来说一下FontMetrics这个类.这个类是关于字符属性和測量的类 用图能够更精确的知道各个属性的含义: 我们在Layout中有一个ImageView,我们能够通过: <span style ...

  6. 一个ICON图标的转换程序

    抽空写了一个ICON图标的转换程序,支持png\jpe\bmp格式到ico的转换.具体的程序就在下面,如果看的人多,过两天再把思路写一下.废话不说,见代码.                       ...

  7. 【值转换器】 WPF中Image数据绑定Icon对象

    原文:[值转换器] WPF中Image数据绑定Icon对象        这是原来的代码:        <Image Source="{Binding MenuIcon}" ...

  8. WPF 4 开发Windows 7 任务栏(Overlay Icon、Thumbnail Toolbar、Progress Bar)

    原文:WPF 4 开发Windows 7 任务栏(Overlay Icon.Thumbnail Toolbar.Progress Bar)      在上一篇我们介绍了如何在WPF 4 中开发Wind ...

  9. C#Image和Icon的相互转化

    Image img = Image.FromHbitmap(icon.ToBitmap().GetHbitmap()); Graphics g = Graphics.FromImage(img); g ...

随机推荐

  1. Activiti学习记录(四)

    1 连线 注意:如果将流程图放置在和java类相同的路径,需要配置: 1.1 部署流程定义+启动流程实例 ProcessEngine processEngine = ProcessEngines.ge ...

  2. selenium 双击元素

    #定位元素 pod_input = driver.find_element(By.ID, 'j_idt9:searchForm:j_idt11:toSelectorLocation:toSelecto ...

  3. 【php】如何配置自主域名腾讯企业邮箱

    腾讯企业邮配置 protocal ssl smtp port 465 host smtp.exmail.qq.com user email account passwd email passwd

  4. oracle 11gR2 for win7旗舰版64安装以及连接plsql和NaviCat(win64_11gR2_database) (2012-12-31-bd 写的日志迁移

    先到oracle官网http://www.oracle.com/technetwork/cn/database/enterprise-edition/downloads/index.html下载必要数 ...

  5. [NOIP2012]疫情控制(二分答案+倍增+贪心)

    Description H国有n个城市,这n个城市用n-1条双向道路相互连通构成一棵树,1号城市是首都,也是树中的根节点. H国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到边境 ...

  6. 用js立即执行函数开发基于bootstrap-multiselect的联动参数菜单

    代码调用方式如下: data=[{F0:总分类cd,F1:总分类name,F2:大分类cd,F3:大分类name,F4:中分类cd,F5:中分类name,F6:小分类cd,F7:小分类name},.. ...

  7. 启动子Activity

    启动普通子Activity: 一个activity启动另一个activity最简单的方式是使用 startActivity(Intent) 方法: public void startActivity( ...

  8. Pre 自动换行和手动换行

    pre { white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre ...

  9. IOS开发---菜鸟学习之路--(十一)-使新闻内容自适应高度

    上一章当中,我们留了一个小BUG. 其实就是浏览新闻的时候,如果文字内容过长的花,UITextView 会有个下拉框,而最底层的UIScrollView也有个下拉框,那么在使用的时候就会非常的不爽. ...

  10. 【POJ 3764】The Xor-longest Path

    题目 给定一个\(n\)个点的带权无根树,求树上异或和最大的一条路径. \(n\le 10^5\) 分析 一个简单的例子 相信大家都做过这题: 给定一个\(n\)个点的带权无根树,有\(m\)个询问, ...