137上位机VC MFC图片添加水印功能
137上位机VC MFC图片添加水印功能
功能展示
给图片添加水印是比较常见的现象,我们在网络上查找图片时,经常会看到图片上的版权文字,我们当前例程实现给JPG等常见格式图片添加水印功能,效果如图; 要点提示 当前例程也是通过微软的GDI+ 图形库实现;库的使用我们在前面例程中已详细介绍使用的三个步骤; 这里我们通过Graphics类的DrawImage(), DrawString()实现图片的水印效果,然后通过Save()保存合成的图片到硬盘上;
实现功能 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+实现水印添加功能; 给对话框资源添加<打开图片><添加水印>按钮控件,关联函数; 添加文本控件,用于显示已打开图片的路径,ID改为IDC_PATH; 添加编辑框控件,用于输入水印文字,ID改为IDC_EDIT1;
4.实现打开图片,添加水印功能,函数体为 - void CGkbc8Dlg::OnOpen()
- {
- CFileDialog Dlg(TRUE, "", "", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
- "图像文件|*.bmp;*.jpg;*.jpeg||");
- if (Dlg.DoModal()==IDOK) //打开文件对话框
- {
- m_Strextend = Dlg.GetFileExt();
- m_FileName = Dlg.GetFileName();
- SetDlgItemText(IDC_PATH,Dlg.GetPathName() );
- }
- }
- void CGkbc8Dlg::OnAdd()
- {
- CString sPath("");
- CString sMarkText;
- GetDlgItemText(IDC_PATH,sPath);
- if(!sPath.IsEmpty()) //已打开图片
- {
- GetDlgItemText(IDC_EDIT1,sMarkText);//水印文字
- PointF ptf(0,0); //水印文字的起始位图坐标
- LOGFONT lf;
- ::GetObject((HFONT)GetStockObject(DEFAULT_GUI_FONT), sizeof(lf), &lf);
- memcpy(lf.lfFaceName, "Arial", 5) ;
- lf.lfHeight = 48 ;
- Font font(GetDC()->m_hDC, &lf); //水印文字字体
- SolidBrush brush(Color(255, 255, 0, 0)); //水印文字画刷
- int nLen = MultiByteToWideChar(CP_ACP, 0, sMarkText, -1, NULL, 0);//水印字符长度
-
复制代码- if (m_Strextend == "jpg"||m_Strextend == "jpeg" || m_Strextend == "bmp")
- {
- Bitmap *pBmp = Bitmap::FromFile(sPath.AllocSysString());
- sPath.ReleaseBuffer();
- if(pBmp)
- {
- Graphics *pGraph = Graphics::FromImage(pBmp);
- pGraph->DrawImage(pBmp, 0, 0, pBmp->GetWidth(), pBmp->GetHeight());
- pGraph->DrawString(sMarkText.AllocSysString(), nLen, &font, ptf, &brush);
- sMarkText.ReleaseBuffer();
- //<>
- int pos = sPath.ReverseFind('\\');
- char chName[MAX_PATH] = {0};
- sPath = sPath.Left(pos);
- sPath += "\\工控编程吧";
- int nRlt = CreateDirectory(sPath, NULL);//新建目录
- //<>
- CLSID clsid;
- GetCodecClsid(L"image/jpeg", &clsid);
-
- int nQuality = 95;
- EncoderParameters Encoders;
- Encoders.Count = 1;
- Encoders.Parameter[0].Guid = EncoderQuality;
- Encoders.Parameter[0].Type = EncoderParameterValueTypeLong;
- Encoders.Parameter[0].NumberOfValues = 1;
- Encoders.Parameter[0].Value = &nQuality;
-
- sPath += '\\'; sPath += m_FileName;
- pBmp->Save(sPath.AllocSysString(), &clsid, &Encoders);
- sPath.ReleaseBuffer();
- delete pBmp;
- }
- }
- }
复制代码}其中GetCodecClsid ()为 自定义函数用于获得图片编码 我们来演示下功能实现的整个过程
|