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;

    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 = {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];
        pOpaque = new 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(pDC);

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

    return dib;
}

HBITMAP CMouseClickDlg::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;

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 = {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];
        pOpaque = new 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(pDC);

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

return dib;
}

时间: 2024-12-29 23:36:20

Icon 转 Bitmap的相关文章

如何将Icon转成Bitmap

个最近工作中有个需求是将Icon转成带Alpha通道的Bitmap, 虽然网上有不少这方面的文章,但很多都是错的, 这里记录下,或许对后来人有用. 要实现这个功能,我们首先需要理解Icon的格式,我们可以看到Icon的结构如下: typedef struct _ICONINFO {    BOOL fIcon;    DWORD xHotspot;    DWORD yHotspot;    HBITMAP hbmMask;    HBITMAP hbmColor;} ICONINFO;type

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

最近工作中有个需求是将Icon转成带Alpha通道的Bitmap, 虽然网上有不少这方面的文章,但很多都是错的, 这里记录下,或许对后来人有用. 要实现这个功能,我们首先需要理解Icon的格式,我们可以看到Icon的结构如下: typedef struct _ICONINFO {    BOOL fIcon;    DWORD xHotspot;    DWORD yHotspot;    HBITMAP hbmMask;    HBITMAP hbmColor;} ICONINFO;typed

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

一直接触这些东西,还是归个类整理一下比较好. Resource -> Drawable Drawable draw1 = this.getResources().getDrawable(R.drawable.icon); Drawable -> Bitmap 1. static Bitmap drawableToBitmap(Drawable drawable) // drawable 转换成bitmap { int width = drawable.getIntrinsicWidth();/

android在如果绘制自定义的bitmap,然后返回给ImageView

先来说一下FontMetrics这个类,这个类是关于字符属性和测量的类 用图可以更精确的知道各个属性的含义: 我们在Layout中有一个ImageView,我们可以通过: <span style="white-space:pre"> </span>ImageView item_image = (ImageView)findViewById(R.id.item_image); item_image.setImageBitmap(makeMessageCenterI

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

原文:[值转换器] WPF中Image数据绑定Icon对象 ? ? ? ?这是原来的代码: ? ? ? ?<Image Source="{Binding MenuIcon}" ?/> ? ? ? ?这里的MenuIcon是string类型,MenuIcon = "/Image/Tux.ico". ? ? ? ?我遇到的问题是,同事已经封装好的类中的MenuIcon是Icon对象,并不是一个相对或者绝对的路径,另外WPF里也没有可以直接表示Icon对象的控

NavigationTabBar 多彩Tab页

演示: 源码下载 代码: MainActivity.java package com.bzu.gxs.meunguide; import android.app.Activity; import android.graphics.Color; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatAc

Android 程序员必须知道的 53 个知识点

1. android 单实例运行方法 我们都知道 Android 平台没有任务管理器,而内部 App 维护者一个 Activity history stack 来实现窗口显示和销毁,对于常规从快捷方式运行来看都是 startActivity 可能会使用 FLAG_ACTIVITY_NEW_TASK 标记来打开一个新窗口,比如 Launcher,所以考虑单任务的实现方法比较简单,首先 Android123 纠正下大家一种错误的方法就是直接在androidmanifest.xml 的 applica

Delphi常见图象格式转换技术

TJPEGScale = (jsFullSize, jsHalf, jsQuarter, jsEighth);//图片大小(全部,1/2,1/4,1/8)TBitmap.pixelFormat:=pf8bit;//图片位数(8,24) 给大家提供几个常用的图象格式转换方法和其转换函数希望可以对你有帮助1. ICO图标转换BMP格式2. 32x32 BMP格式图象转换为 ICO格式3.转换BMP->JPEG文件格式4.JPEG 转换为BMP函数5.Bmp转换为JPEG文件格式函数---------

Delphi 把一个ICO转换为BMP

// 方法1 var Icon : TIcon; Bitmap : TBitmap; begin Icon := TIcon.Create; Bitmap := TBitmap.Create; Icon.LoadFromFile('c:\picture.ico'); //Load an ICO from File Bitmap.Width := Icon.Width; Bitmap.Height := Icon.Height; Bitmap.Canvas.Draw(0, 0, Icon ); B