MFC VC++ 图片转换,PNG转32位BMP;BMP大小转换

PNG转32位BMP 使用GDI+方式转换  这种方式转换经测试可以保留PNG图片的透明背景,当然也需要支持32位bmp查看的软件,否则显示黑色背景

 1 //头文件 lib  命名空间
 2 #include <GdiPlus.h>
 3 #pragma comment(lib, "gdiplus.lib")
 4 using namespace Gdiplus;//使用命名空间Gdiplus
 5 //声明
 6 GdiplusStartupInput gdiplusStartupInput;//GDI+环境
 7 ULONG_PTR gdiplusToken;//GDI+对象
 8 Gdiplus::Image* p_gdiPlusImage;//GDI+图片对象
 9 //初始化GDI+
10 gdiplusToken = NULL;//GDI+对象
11 p_gdiPlusImage = NULL;//GDI+图片对象  
12 GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
 1 BOOL xxxDlg::picturePngTo32BitBmp()
 2 {
 3     CString strSrcPicturePath = _T("d:\\123.png");
 4     if (PathFileExists(strSrcPicturePath))
 5     {
 6         p_gdiPlusImage = Image::FromFile(strSrcPicturePath);// 加载图片文件
 7         if (p_gdiPlusImage)
 8         {
 9             int srcW = p_gdiPlusImage->GetWidth();
10             int srcH = p_gdiPlusImage->GetHeight();
11             int dstW = srcW;
12             int dstH = srcH;
13             //
14             UINT nCount = p_gdiPlusImage->GetFrameDimensionsCount();
15             GUID* pDimensionIDs = new GUID[nCount];
16             if (pDimensionIDs)
17             {
18                 //得到子帧的对象列表
19                 p_gdiPlusImage->GetFrameDimensionsList(pDimensionIDs, nCount);
20                 //获取总帧数
21                 UINT nFrameCount = p_gdiPlusImage->GetFrameCount(&pDimensionIDs[0]);
22                 //设置当前需要显示的帧数
23                 GUID pageGuid = FrameDimensionTime;
24                 for (UINT i = 0; i < nFrameCount; i++)
25                 {
26                     p_gdiPlusImage->SelectActiveFrame(&pageGuid, i);
27                     //GDI+绘图
28                     CImage imgDest;
29                     imgDest.Create(dstW, dstH, 32);
30                     Graphics graphics(imgDest.GetDC());
31                     ImageAttributes imAtt;
32                     imAtt.SetWrapMode(WrapModeTileFlipXY);
33                     graphics.SetPixelOffsetMode(PixelOffsetModeHalf);
34                     graphics.DrawImage(p_gdiPlusImage, Gdiplus::RectF((Gdiplus::REAL)0, (Gdiplus::REAL)0, (Gdiplus::REAL)dstW,
35                         (Gdiplus::REAL)dstH), 0, 0, (Gdiplus::REAL)srcW, (Gdiplus::REAL)srcH, UnitPixel, &imAtt);
36                     //保存
37                     CString strDestPath = _T("d:\\321.bmp");
38                     HRESULT hr = imgDest.Save(strDestPath, IMAGE_SAVE_BMP);
39                     if (SUCCEEDED(hr))
40                     {
41                         AfxMessageBox(_T("成功"));
42                     }
43                     imgDest.ReleaseDC();
44                     imgDest.Destroy();
45                 }
46                 delete pDimensionIDs;
47                 pDimensionIDs = NULL;
48                 delete p_gdiPlusImage;
49                 p_gdiPlusImage = NULL;
50                 return TRUE;
51             }
52             else
53             {
54                 return FALSE;
55             }
56 
57         }
58         else
59         {
60             return FALSE;
61         }
62     }
63     else
64     {
65         return FALSE;
66     }
67 }

 

posted @ 2019-10-25 11:28  ckrgd  阅读(1446)  评论(0编辑  收藏  举报