• 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 }
  • 相关阅读:
    c语言分支和循环语句
    C语言基础知识
    磁盘管理-fdisk
    搭建Discuz
    KVM创建虚拟机相关操作
    WINRAR exe 捆绑 小游戏
    linux vi编辑器&文件目录管理
    灰鸽子木马的功能体验
    sqlalchemy 级联删除
    sqlalchemy 多对多
  • 原文地址:https://www.cnblogs.com/ckrgd/p/11737072.html
Copyright © 2020-2023  润新知