从文件中提取HICON数据,非常简单

介绍一种提取文件或者文件夹的图标的方法,保存为背景透明的PNG图标。


【1】从文件中提取HICON数据,非常简单


//获取文件的图标HICONHICON GetFileIcon(const CString& strFilePath, BOOL bLarge)
{  SHFILEINFO SHFI;  ZeroMemory(&SHFI, sizeof(SHFI));  DWORD_PTR ret = ::SHGetFileInfo(strFilePath, 0, &SHFI, sizeof(SHFI), 
                  SHGFI_ICON | (bLarge ? SHGFI_LARGEICON : SHGFI_SMALLICON));  if (ret != 0)  {    return SHFI.hIcon;  }  return NULL;
}

【2】将HICON保存为PNG图片

//获取特定图片类型的编码int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{  UINT num = 0, size = 0;  Gdiplus::GetImageEncodersSize(&num, &size);  if(size == 0)    return -1;  // Failure  Gdiplus::ImageCodecInfo* pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size));  Gdiplus::GetImageEncoders(num, size, pImageCodecInfo);  bool found = false;  for (UINT ix = 0; !found && ix < num; ++ix) 
  {    if (_wcsicmp(pImageCodecInfo[ix].MimeType, format) == 0) 
    {      *pClsid = pImageCodecInfo[ix].Clsid;      found = true;      break;    }  }  free(pImageCodecInfo);  return found;
}//根据图标HICON保存图片为Png图片bool SaveHIconToPngFile(HICON hIcon, LPCTSTR lpszPicFileName)
{  
  if (hIcon == NULL)  {    return false;  }  ICONINFO icInfo = { 0 };    
  if (!::GetIconInfo(hIcon, &icInfo))  {    return false;  }  BITMAP bitmap; 
  GetObject(icInfo.hbmColor, sizeof(BITMAP), &bitmap);  Gdiplus::Bitmap* pBitmap = NULL;  Gdiplus::Bitmap* pWrapBitmap = NULL;  do   {    if (bitmap.bmBitsPixel != 32) 
    {   
      pBitmap = Gdiplus::Bitmap::FromHICON(hIcon); 
    } 
    else    {      pWrapBitmap = Gdiplus::Bitmap::FromHBITMAP(icInfo.hbmColor, NULL);      if (!pWrapBitmap)        break;      Gdiplus::BitmapData bitmapData;      Gdiplus::Rect rcImage(0, 0, pWrapBitmap->GetWidth(), pWrapBitmap->GetHeight());      pWrapBitmap->LockBits(&rcImage, Gdiplus::ImageLockModeRead, pWrapBitmap->GetPixelFormat(), &bitmapData);      pBitmap = new (Gdiplus::Bitmap)(bitmapData.Width, bitmapData.Height, bitmapData.Stride, PixelFormat32bppARGB, (BYTE*)bitmapData.Scan0);      pWrapBitmap->UnlockBits(&bitmapData);    }    CLSID encoderCLSID;    GetEncoderClsid(_T("image/png"), &encoderCLSID);    Gdiplus::Status st= pBitmap->Save(lpszPicFileName ,&encoderCLSID, NULL);    if( st != Gdiplus::Ok )      break;  } while (false);	

  delete pBitmap; 
  if (pWrapBitmap)    delete pWrapBitmap;  DeleteObject(icInfo.hbmColor); 
  DeleteObject(icInfo.hbmMask);  

  return true;
}

【3】测试代码

HICON hIcon = GetFileIcon(L"C:\\Git\\unins000.exe", true);  if (hIcon != NULL)  {    bRet = SaveHIconToPngFile(hIcon, L"D:\\filterTest\\txtTojpg.png");    ::DestroyIcon(hIcon);  }


你可能感兴趣的:(从文件中提取HICON数据,非常简单)