[一分钟学会系列之五]一分钟学会提取文件图标,保存为透明图片(附DEMO程序)
2011-08-08 09:10
369 查看
这篇文章介绍一种提取文件或者文件夹的图标的方法,可以保存为背景透明的PNG图标,没有讨厌的黑色背景,嘿嘿。
1. 首先从文件中提取HICON数据,非常简单
// 调用方负责DestroyIcon HICON
HICON 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中拿出HBITMAP数据,做一些手脚,把它保存成透明的PNG图片
bool SaveHIcon2PngFile(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;
if (bitmap.bmBitsPixel != 32)
{
pBitmap = Gdiplus::Bitmap::FromHICON(hIcon);
}
else
{
pWrapBitmap = Gdiplus::Bitmap::FromHBITMAP(icInfo.hbmColor, NULL);
if (!pWrapBitmap)
return false;
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/*&encoderParameters*/);
if( st != Gdiplus::Ok )
return false;
delete pBitmap;
if (pWrapBitmap)
delete pWrapBitmap;
DeleteObject(icInfo.hbmColor);
DeleteObject(icInfo.hbmMask);
return true;
}
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
UINT num = 0; // number of image encoders
UINT size = 0; // size of the image encoder array in bytes
Gdiplus::ImageCodecInfo* pImageCodecInfo = NULL;
Gdiplus::GetImageEncodersSize(&num, &size);
if(size == 0)
return -1; // Failure
pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1; // Failure
GetImageEncoders(num, size, pImageCodecInfo);
for(UINT j = 0; j < num; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j; // Success
}
}
free(pImageCodecInfo);
return -1; // Failure
}
3. HICON使用完要记得释放掉
BOOL SaveFileIcon(const CString& strFilePath, const CString& strImagePath, BOOL bLarge = TRUE)
{
BOOL bRet = FALSE;
HICON hIcon = GetFileIcon(strFilePath, bLarge);
if (hIcon != NULL)
{
bRet = SaveHIcon2PngFile(hIcon, strImagePath);
::DestroyIcon(hIcon);
}
return bRet;
}
上面的代码使用了gdiplus,需要包含gdiplus.h,链接gdiplus.lib,并初始化gdiplus环境(GdiplusStartup)。
完整的例子可以去这里下载: http://download.csdn.net/source/3525053
1. 首先从文件中提取HICON数据,非常简单
// 调用方负责DestroyIcon HICON
HICON 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中拿出HBITMAP数据,做一些手脚,把它保存成透明的PNG图片
bool SaveHIcon2PngFile(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;
if (bitmap.bmBitsPixel != 32)
{
pBitmap = Gdiplus::Bitmap::FromHICON(hIcon);
}
else
{
pWrapBitmap = Gdiplus::Bitmap::FromHBITMAP(icInfo.hbmColor, NULL);
if (!pWrapBitmap)
return false;
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/*&encoderParameters*/);
if( st != Gdiplus::Ok )
return false;
delete pBitmap;
if (pWrapBitmap)
delete pWrapBitmap;
DeleteObject(icInfo.hbmColor);
DeleteObject(icInfo.hbmMask);
return true;
}
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
UINT num = 0; // number of image encoders
UINT size = 0; // size of the image encoder array in bytes
Gdiplus::ImageCodecInfo* pImageCodecInfo = NULL;
Gdiplus::GetImageEncodersSize(&num, &size);
if(size == 0)
return -1; // Failure
pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1; // Failure
GetImageEncoders(num, size, pImageCodecInfo);
for(UINT j = 0; j < num; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j; // Success
}
}
free(pImageCodecInfo);
return -1; // Failure
}
3. HICON使用完要记得释放掉
BOOL SaveFileIcon(const CString& strFilePath, const CString& strImagePath, BOOL bLarge = TRUE)
{
BOOL bRet = FALSE;
HICON hIcon = GetFileIcon(strFilePath, bLarge);
if (hIcon != NULL)
{
bRet = SaveHIcon2PngFile(hIcon, strImagePath);
::DestroyIcon(hIcon);
}
return bRet;
}
上面的代码使用了gdiplus,需要包含gdiplus.h,链接gdiplus.lib,并初始化gdiplus环境(GdiplusStartup)。
完整的例子可以去这里下载: http://download.csdn.net/source/3525053
相关文章推荐
- [一分钟学会系列之六]一分钟学会自定义鼠标指针图标(附DEMO程序)
- 提取文件图标,保存为透明图片
- C++ GDI+提取系统文件或文件夹的图标,保存为透明图片
- [IOS]包含增删改查移动的tableView展示+plist文件保存+程序意外退出保存Demo
- [IOS]包含增删改查移动的tableView展示+plist文件保存+程序意外退出保存Demo
- [IOS]包含增删改查移动的tableView展示+plist文件保存+程序意外退出保存Demo
- 一个从EXE、DLL文件中提取、存取图标完整程序
- 【转】 一个从EXE、DLL文件中提取、存取图标完整程序
- [一分钟学会系列之三]一分钟学会实现透明窗口度效果(待续)
- 提取WORD中的所有InlineShape图片并保存成文件
- 提取WORD中的所有InlineShape图片并保存成文件
- (安全系列二)apk反编译生成程序的源代码和图片、XML配置、语言资源等文件
- 一个从EXE、DLL文件中提取、存取图标完整程序
- 加载上传图片,获取文件名、文件路径并保存到程序的文件夹中
- 一个从EXE、DLL文件中提取、存取图标完整程序
- 网络爬虫,用C#做一个网络爬虫demo,功能有保存网页、图片、js文件、等等其他的文件。有界面显示,有代码注释。
- 如何将S/4HANA系统存储的图片文件用Java程序保存到本地
- (爱加密系列教程十)apk反编译生成程序的源代码和图片、XML配置、语言资源等文件
- 从数据库中读取一个图片并保存为一个图片文件[转]
- 如何使用js将canvas保存为图片文件,并且可以自定义文件名