124上位机VC MFC将位图转换为JPG PNG GIF格式图片
124上位机VC MFC将位图转换为JPG PNG GIF格式图片
功能展示
图片格式的转换是时常用到的功能,VC中并没有直接封装功能控件给我们使用,我们得自己动手实现转换功能,位图是我们编程时极为常用的图片格式,如何将其转换为JPG格式呢? 我们当前例程实现这一功能,效果如图; 要点提示 通过微软的GDI+能够快速轻松实现位图转换为JPG PNG GIF图片格式; GDI+使用前,得下载微软的GDIPLUS支持包,可从微软的管网下载,我们这里给大家进行了打包; 然后是添加头文件再进行简单的初始化操作,在CWinApp派生类的InitInstance函数中进行此项工作是最好的;
实现功能 1.新建基于对话框的应用程序 2.使用前准备GDI+:将例程根目录Include文件夹复制到自己工程根目录。 在StdAfx.h头文件包含GDI+ 头文件及库文件//使用GDI+第一步 #define UNICODE #ifndef ULONG_PTR #define ULONG_PTR unsigned long* #endif #include "Include/gdiplus.h" using namespace Gdiplus; #pragma comment(lib, "Include/gdiplus.lib") 在APP类的InitInstance()中进行初始化 //使用GDI+第二步 GdiplusStartupInputgdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken,&gdiplusStartupInput, NULL); 在程序退出时 进行GDI+ 环境的关闭
//使用GDI+第三步 GdiplusShutdown(gdiplusToken); //关闭gdiplus的环境 3,准备好GDI+后,便是使用GDI+ 加载BMP图片,然后实现将打开的图片保存为其他格式功能; 拖拽一编辑框ID为IDC_EDIT1,拖拽两按钮控件<加载位图><保存为>用于打开位图与保存其他格式图片功能; 拖拽一图片控件ID改为IDC_RECT,用于显示打开的位图; 4.最后就是加载位图与保存为按钮的实现函数 void CGkbc8Dlg::OnLoadbmp() { CFileDialog dlg(TRUE,"bmp","工控编程吧",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "bmp文件(*.bmp)|*.bmp||",NULL); if(IDOK==dlg.DoModal()) { SetDlgItemText(IDC_EDIT1,dlg.GetPathName());//显示图片的全路径 BitmapbmBitmap(dlg.GetPathName().AllocSysString());//创建位图 CDC*pDC=GetDlgItem(IDC_RECT)->GetDC();//获取控件DC Graphicsg(pDC->m_hDC);//创建绘图对像 g.DrawImage(&bmBitmap,0,0) ;//绘制位图 GetDlgItem(IDC_RECT)->ReleaseDC(pDC);//释放DC; }
} - void CGkbc8Dlg::OnSave()
- {
- CFileDialog dlg(FALSE,"jpg","工控编程吧",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
- "jpg文件(*.jpg)|*.jpg|png文件(*.png)|*.png|gif文件(*.gif)|*.gif|bmp文件(*.bmp)|*.bmp||",this);
- if(IDOK==dlg.DoModal())
- {
- CString sExt=dlg.GetPathName();
- int nIndex = sExt.ReverseFind('.');
- if (-1 == nIndex) return;
- sExt = sExt.Right(sExt.GetLength()-nIndex);
- //设置编码方式
- CLSID clsid;
- if(sExt == ".jpg")
- GetEnCoderClsid(L"image/jpeg", &clsid);
- if(sExt == ".png")
- GetEnCoderClsid(L"image/png", &clsid);
- if(sExt == ".gif")
- GetEnCoderClsid(L"image/gif", &clsid);
- if(sExt == ".bmp")
- GetEnCoderClsid(L"image/bmp", &clsid);
- //设置编码参数
- ULONG encoderQuality = 50; //压缩比例
- EncoderParameters encoderParameters;
- encoderParameters.Count = 1;
- encoderParameters.Parameter[0].Guid = EncoderQuality;
- encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
- encoderParameters.Parameter[0].NumberOfValues = 1;
- encoderParameters.Parameter[0].Value = &encoderQuality;
-
- CString sPath;
- GetDlgItemText(IDC_EDIT1,sPath);//获取要转换的位图路径
-
- Bitmap Bitmap(sPath.AllocSysString());
- Status status = Bitmap.Save(dlg.GetPathName().AllocSysString(), &clsid, &encoderParameters);
- if(status != Ok)
- MessageBox("图片转换失败!", "提示", MB_OK|MB_ICONWARNING);
- }
- }
复制代码我们来演示下功能实现的整个过程
|