当前位置:C++技术网 > 资讯 > 图片批处理软件增加水印功能的实现

图片批处理软件增加水印功能的实现

更新时间:2015-10-16 21:03:38浏览次数:1+次

这个礼拜,我为图片批处理软件增加水印的功能,在此写点项目经验,第一次做这样的升级软件的小项目,虽然小,但是收获很大,在后续的过程中,我将实现更强大,更完善的水印功能,敬请期待吧。对于水印的实现,我已经写了很多的文章来介绍了。你可以在里面去找找。在这里很多的细节我就不详述了。说说重点。

首先就是设置控件来实现水印:

如图所示,我添加了三个静态控件,三个编辑框控件。并且关联了三个变量,分别用来表示水印文字,水印坐标位置。接着就是GDI+的声明了。我们需要注意的是,在VS2008以后的编译器中编译器自身提供了GDI+包,不需要我们再像在VC中那样添加GDI+包,接着的声明本站的相关水印文章,我都详细讲解了,尤其是在《纹理画刷的深入讲解》中。我在这里就不详述了。接着就是代码的实现。我们在“开始转换”按钮的消息响应函数中添加如下代码:


//开始转换
void CPictureProcessDlg::OnBnClickedBtnPictureConvert()
{
	if (m_PicturePathName.IsEmpty())
	{
		MessageBox(L"请选择图片", L"提示", MB_ICONEXCLAMATION);
		return;
	}	
	int curWidth, curHigh, oriWidth, oriHigh;//当前宽高,原始宽高
	if(m_mode==FALSE)//指定大小
	{
		UpdateData(TRUE);
		curWidth = m_iWidth;
		curHigh = m_iHigh;
	}
	int fileNum = m_filePathName.size();
	m_ctpro.SetStep(10);
	m_ctpro.SetRange(0, fileNum * 10);
	for (int i = 0; i < fileNum; i++)
	{
		CImage imSrc, imDest;
		imSrc.Load(m_filePathName[i]);//加载图片到图片对象中
		oriWidth = imSrc.GetWidth();
		oriHigh = imSrc.GetHeight();
		if (m_mode == TRUE)
		{
			UpdateData(TRUE);
			curWidth = m_iWidthMax;
			curHigh = (int)(curWidth*oriHigh / oriWidth + 0.5);
		}		
		imDest.Create(curWidth, curHigh, 32);//创建新图片
		HDC imDestDC;
		imDestDC = imDest.GetDC();
		SetStretchBltMode(imDestDC, HALFTONE);//设置位图拉伸模式		
		SetBrushOrgEx(imDestDC, 0, 0, NULL);//设置刷子起始点,此2句能够消除失真,获得高质量图像		
		imSrc.StretchBlt(imDestDC, 0, 0, curWidth, curHigh);
////////////////////////////////水印代码begin///////////////////////////
		CString szText;
		m_WaterText.GetWindowText(szText);
		Graphics *graphics = Graphics::FromHDC(imDestDC);
		Brush *brush = new SolidBrush(Color::Red);//定义GDI+画刷对象
		FontFamily fontFamily(L"宋体");
		Gdiplus::Font font(&fontFamily, 50, FontStyleRegular, UnitPoint);
		PointF ptf;
		ptf.X = m_Xorigin;
		ptf.Y = m_Yorigin;
		//确定字符长度
		//int nLen = MultiByteToWideChar(CP_ACP, 0, szText.GetLength(), -1, NULL, 0);
		//在位图中输出字符串
		graphics->DrawString(szText, szText.GetLength(), &font, ptf, brush);
		////////////////////水印end//////////////
		imDest.ReleaseDC();
		m_PictureTitle.Format(L"%s_%d×%d.", m_fileTitle[i], curWidth, curHigh);
		m_DestPicturePathName = m_PictureFolder + m_PictureTitle + m_fileExt[i];
		imDest.Save(m_DestPicturePathName);
		imSrc.Destroy();
		imDest.Destroy();		
		m_ctpro.SetPos(10 * (i + 1));
	}
	m_ctrl_s_tips.ShowWindow(SW_SHOW);
}
在这里我们需要注意的是我们添加的水印代码的位置,也就是逻辑顺序!我之前就是把水印代码放错了位置,我把它放在了for语句的外面,结果就出不来!我被这个盲区缠住了整整四天!后来修改了团队里新来的一位MFC大神,多亏他帮我修改了位置,后来我仔细琢磨了,其实就是imSrc这个变量的原因,因为他的生命周期只在for语句之内,而我把水印代码放在了for语句之外,在这里这个imSrc的作用就是贴图,没有他那可不成。好了最后看下效果图: