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

本文介绍了一种使用C++及MFC实现动态生成验证码图片的方法。通过具体代码示例展示了如何创建位图、绘制文字并将其保存为文件。

是不是很羡慕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();    //结束绑定
}

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


截图:

屏幕显示



文件打开


### 使用OpenCV在图像中添加文本 由于OpenCV本身不直接支持中文字符的渲染,因此可以采用Freetype库来实现这一功能。具体方法如下: 对于英文字符可以直接利用`cv.putText()`函数完成文字添加操作[^2]。 然而为了支持中文字符,需先安装配置好Freetype库。从指定网站下载适合版本的freetype源码包,按照操作系统环境编译生成所需的`.lib`静态链接库文件以便后续集成到项目当中[^1]。 下面给出一段Python代码示例用于展示如何借助于Freetype库实现在图片上书写中文,最终保存带有新添文字说明的新图片: ```python import cv2 from PIL import Image, ImageDraw, ImageFont def put_chinese_text(image_path, text, position=(50, 50), font_size=36): # 加载原始图片 image = Image.open(image_path).convert('RGB') draw = ImageDraw.Draw(image) # 设置字体路径以及大小 font = ImageFont.truetype("simhei.ttf", font_size) # 添加中文文本至图片 draw.text(position, text, fill="red", font=font) # 转换回opencv格式保存结果 result_image = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR) output_filename = 'output_with_text.jpg' cv2.imwrite(output_filename, result_image) put_chinese_text('input_image.jpg', '你好世界') ``` 此段脚本首先通过PIL库加载输入图片创建绘图对象;接着定义所使用的字体样式(这里选用的是黑体),通过`draw.text()`方法将指定位置的文字绘制上去;最后再把经过处理过的图像转换成OpenCV能够识别的形式,从而方便地调用`imwrite()`接口导出含有所需标注信息的结果文件。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值