圖片轉換,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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM