VC中生成文字图片并保存到文件目录

是不是很羡慕PHP的动态生成验证码图片的功能呢?其实无所不能的C++干这个也是小菜的啦~~


自己用mfc写了个小例子,能实现绘制一张图片显示到屏幕上,并保存到文件目录


1,生成文字图片的函数

HBITMAP CmfctestDlg::NewBitmap(HDC hdc, wchar_t *pszText, int iWidth, int iHeight)
{
	if (pszText == NULL)
		return NULL;
	HBITMAP hBmp = CreateCompatibleBitmap(hdc, iWidth, iHeight);//创建要返回的位图句柄,此处的hdc参数必须是与实际窗口绑定的DC,如果是内存DC则图片没有颜色只有灰度
	HDC hMemDC = CreateCompatibleDC(hdc);//创建与显示设备相关的内存设备上下文
	SelectObject(hMemDC, hBmp);
	//在位图上写字
	SetBkMode(hMemDC, TRANSPARENT);
	RECT rc = {0, 0, iWidth, iHeight};
	HBRUSH hb = ::CreateSolidBrush(RGB(0, 0, 0));  //设置笔刷颜色
	FillRect(hMemDC, &rc, hb);    //填充矩形
	HFONT hf;
	LOGFONT lf;  //创建字体结构体
	lf.lfHeight=70;
	lf.lfWidth=20;
	lf.lfEscapement=0;
	lf.lfOrientation=0;
	lf.lfItalic=false;
	lf.lfUnderline=false;
	lf.lfStrikeOut=false;
	lf.lfCharSet=DEFAULT_CHARSET;
	lf.lfOutPrecision=0;
        lf.lfWeight=500;  //0-1000,1000加到最粗
	lf.lfClipPrecision=0;
	lf.lfQuality=0;
	lf.lfPitchAndFamily=0;
	//可以使宋体,楷体,微软雅黑  等等中文字体  或者Arial  Times New Roman 等英文字体
	wcscpy_s(lf.lfFaceName,L"微软雅黑");  //此处不能用strcpy
	hf=CreateFontIndirect(&lf);
	SelectObject(hMemDC,hf);	
	SetTextColor(hMemDC,RGB(0,255,0));    //设置字体颜色
	DrawText(hMemDC, pszText, -1, &rc, DT_CENTER);  //居中
	//释放资源
	DeleteDC(hMemDC);
	DeleteObject(hb);
	return hBmp; //返回创建好的位图
}
2,调用图片生成并保存到文件目录
void CmfctestDlg::OnBnClickedButton3()
{
	// TODO: Add your control notification handler code here
	HDC hdc = ::GetDC(m_hWnd);  //m_hWnd是当前窗口的句柄,在这个窗口上建立一个绘制上下文,也可以不依托于实际的窗口,直接在内存中创建DC
	int iWidth = 400, iHeight = 100;  
	HBITMAP hBmp = NewBitmap(hdc, L"踏莎行hyx", iWidth, iHeight);
	HDC hMemDC = CreateCompatibleDC(hdc);
	SelectObject(hMemDC, hBmp);
	BitBlt(hdc, 0, 0, iWidth, iHeight, hMemDC, 0, 0, SRCCOPY);
	DeleteDC(hMemDC);
	CImage image;
	image.Attach(hBmp);                //将位图转化为一般图像
	CString str=L"testimg.bmp";
	image.Save(str);     //保存图像
	image.Detach();    //结束绑定
}

注意有些函数要用双冒号来调用全局的函数来完成。


截图:

屏幕显示

VC中生成文字图片并保存到文件目录_第1张图片


文件打开

VC中生成文字图片并保存到文件目录_第2张图片

你可能感兴趣的:(图片,字体,位图)