工控编程吧
标题:
137上位机VC MFC图片添加水印功能
[打印本页]
作者:
qq263946146
时间:
2015-12-30 22:32
标题:
137上位机VC MFC图片添加水印功能
(, 下载次数: 2)
上传
点击文件名下载附件
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 ()为 自定义函数用于获得图片编码
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/472d26a837af07dbdb6013e2bd026ec0/0/0/w_19rtd405n1.swf-albumId=5111997409-tvId=5111997409-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 1)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4