当前位置:C++技术网 > 资讯 > 利用GDI+处理水印(2)

利用GDI+处理水印(2)

更新时间:2015-10-03 01:17:55浏览次数:1+次

首先基于对话框创建一个工程名为ImageText。接着我们在对话框上添加一些控件:
四个编辑框从上到下,从左到右的ID号分别是:
IDC_FILENAME 关联成员变量m_FileName
IDC_ORIGINX 关联成员变量m_OriginX
IDC_ORIGINY 关联成员变量m_OriginY
IDC_WATERMARK 关联成员变量m_WaterText
然后就是两个按钮控件的ID号(从左到右)标题改为“...”,“水印效果”
IDC_BROWSE                     为这两个ID号添加类向导
IDC_IMAGE_TEXT

最后就是四个静态文本空间,分别写上如图标题

最后就是图片控件哦!

我们需要修改类型为“位图”,同时我们为它关联一个成员变量m_ImageDemo。
我们在ImageTextDlg的头文件中添加上《水印1》中的开头部分的代码,也就是需要我们链接的库以及需要包含的头文件等。但首先你得有一个GDI+头文件包哦!我们把它放到ImageText文件夹中。

我们先看看添加成员变量的页面:

注意哦!成员变量的种类哦!有三个是控件类型的,两个坐标就是值类型的

接着就是处理的我们的两个类向导了。
第一个:

void CImageTextDlg::OnBrowse() 
{
	CFileDialog flDlg(TRUE, "", "", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
						"图像文件|*.bmp;*.jpg;*.jpeg;*.gif||");					//定义文件打开对话框
	if (flDlg.DoModal() == IDOK)
	{
		CString szText = flDlg.GetPathName();
		m_FileName.SetWindowText(szText);
		if (m_pBmp != NULL)
		{
			delete m_pBmp;
			m_pBmp = NULL;
		}
		m_pBmp = Bitmap::FromFile(szText.AllocSysString());//根据文件名称生成GDI+位图对象
		Color bkClr(0, 0, 0);
		HBITMAP hBmp;
		m_pBmp->GetHBITMAP(bkClr, &hBmp);
		m_ImageDemo.SetBitmap(hBmp);
		szText.ReleaseBuffer();
	}
}
这个类向导的形式我们不陌生吧。《学习心得之八------实现从磁盘读入图片文件》里也有介绍哦,而且关于成员变量的创建也有介绍哦!不懂的话你可以看看。我就不解释了。
第二个类向导:
//水印处理
void CImageTextDlg::OnImageText() 
{
	UpdateData();//更新窗口获取数据
	CString szText;
	m_WaterText.GetWindowText(szText);//1
	if (!szText.IsEmpty() && m_pBmp != NULL)
	{
		Graphics *pGraph = Graphics::FromImage(m_pBmp);//生成Graphics对象//2
		Brush *brush = new SolidBrush (Color(255,255,0,0));//定义GDI+画刷对象//3
		Font *font = new Font(L"Arial", 12);//定义GDI+字体对象	//4
		PointF ptf;//5
		ptf.X = m_OriginX;
		ptf.Y = m_OriginY;
		//确定字符长度
		int nLen = MultiByteToWideChar(CP_ACP, 0, szText, -1, NULL, 0);//6
		//在位图中输出字符串
		pGraph->DrawString(szText.AllocSysString(), nLen, font, ptf, brush);//7
		szText.ReleaseBuffer();
		Color clr;
		HBITMAP hBmp, hOldBmp;
		m_pBmp->GetHBITMAP(clr, &hBmp);
		hOldBmp = m_ImageDemo.SetBitmap(hBmp);//8
		if (hOldBmp)
		{
			DeleteObject(hOldBmp);
		}
	}
}
这就是我们处理水印的关键代码!我们按着顺序解释:
1,对于我们写入文字的编辑框,我们已经关联了m_WaterText,并调用getwindowtext函数来获取文本给szText。
2,首先呢FromImage函数的参数是Image类的,但,bitmap类是Image类的派生类,因此我们也可以用bitmap类。我们调用这个函数将我们的位图对象变成Gdiphics对象
3,我们利用SolidBrush创建一个实心画笔对象。其参数是color类。color类后三个参数就是红绿蓝三种颜色,你可以自己设置,第一个我们将其设为255,你可以自己查MSDN哦!
4,我们写入图片的水印文字的描述,第一个就是字体的种类,第二个就是字体的颜色,
5,是我们写入水印文字的坐标,与CPoint不同的是,这个是一对。你可以不必掌握
6,就是我们水印写入文字成功字数!
7,就是我们关键中的关键哦!我们调用这个函数实现写入水印。对于他的实现,我们看下面的例子:
VOID Example_DrawString2(HDC hdc)
{
   Graphics graphics(hdc);

   // Create a string.
   WCHAR string[] = L"Sample Text";

   // Initialize arguments.
   Font myFont(L"Arial", 16);
   PointF origin(0.0f, 0.0f);
   SolidBrush blackBrush(Color(255, 0, 0, 0));

   // Draw string.
   graphics.DrawString(
   string,
   11,
   &myFont,
   origin,
   &blackBrush);
}
8,就是将我们的水印图片添加到图片控件上!


但是,还是有bug哦!下篇我们再详述!先看看最后应该有的实现结果吧! 

刚刚我同学和我说:“苦逼的程序员,现在还在敲代码!”,我还不是程序员呢!不过在努力!谁说程序员就是苦的,累的!!!来看福利(暂时先发出实现的结果效果!)