MFC & Gdi+ 实现在图片上写中文 (OpenCV原生不支持写中文本到图片,当然FreeType库也可实现)
2014-06-24 08:29
267 查看
你从来不会觉得,在图片上打上中文语句会有多么困难,除非你真正做过一次。
也许你学过OpenCV, 认为没什么困难,可以用一个putText函数搞定。博主一开始也这样天真,但是动手后才发现,OpenCV原生函数putText却是不支持中文字体的,想要实现这个功能,需要再动一番手脚。
这个故事告诉我们,理论和实践从来都不是一回事。
从网上搜集的资料来看,觉的可行的有两种方案:
下载FreeType库,参考:http://blog.sina.com.cn/s/blog_6bbd2dd101012dbh.html
利用Gdiplus,参考:/article/7017705.html
本质上两种都是一样的,就是调用库。由于看到FreeType库下载下来后还需要自己编译,就果断放弃了,等以后有时间,再用一下。
FreeType库的下载地点:http://gnuwin32.sourceforge.net/packages/freetype.htm
可以下载编译好的安装包,也可以下载源文件自己编译,不过我想最好还是用现成的包吧,自己编译等有空有兴趣不妨搞一搞。
FreeType包的安装也很简单,和OpenCV的安装一样,用的时候需要在工程中进行相关配置,我的环境是VS2013+Win8.1+OpenCV2.4.8+FreeType2.3.5,我们新建一个C++控制台应用程序,并把OpenCV和FreeType配置好,OpenCV我就不多说了,只讲讲FreeType需要配置的路径,在VS2013项目属性中包含:
头文件包含目录:
安装根目录\GnuWin32\include
安装根目录\GnuWin32\include\freetype2
库文件包含目录:
安装根目录\GnuWin32\lib
链接器附加依赖项:freetype.lib
还有把 “安装根目录\GnuWin32\bin” 添加到环境变量PATH中,这和OpenCV是一样的,因为可能用到动态链接库。
这样FreeType就配置好了。
之后,在工程中添加下面的三个代码文件:cvxText.h、cvxText.cpp、test.cpp,当然运行所需要的图片文件和字体文件你要准备好放在程序能够找到目录下面,字体文件可以去C:\Windows\Fonts\下拷贝。之后编译运行,如果出现下面的错误提示:
错误 1 error C4996: 'fopen':This function or variable may be unsafe. Consider using fopen_s instead. To disable
deprecation, use_CRT_SECURE_NO_WARNINGS. See online help for details. d:\microsoft visual studio 12.0\opencv-2.4.8\opencv\build\include\opencv2\flann\logger.h 66
这是由于接口文件使用了较古老的c语言函数,可以通过在工程属性的编译器预处理器定义中加入_CRT_SECURE_NO_WARNINGS 项来抑制。
充分发挥你的复制粘贴能力对它们进行拷贝吧!
下面是输入结果图,用来欣赏:
![](http://img.blog.csdn.net/20141120231414549?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd196X3pfMTk5MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
当然,如果你对FreeType感兴趣,不妨去读读它的教程:
http://www.freetype.org/freetype2/docs/tutorial/step1.html
或者你可以完善一下那个接口文件,并写一篇类似的文章,以惠及更多的用户。
VC6.0中需要做相应的配置,基本上就是在 工具|选项|目录 中包含 GdiPlus 下的 include 和 lib 文件夹路径 以及在 工程 中加入 Gdiplus.lib的库链接依赖项,使用动态链接库就需要把bin目录添加到系统环境变量中,大体上和OpenCV的配置相同。
使用VS2005以上的朋友就不用了,因为它已经包含在内了。下面就让我们用代码来说明一切,在IDE中新建空的控制台工程,并添加下面的代码进去,在工程目录下放一张名为 image.jpg的图片即可,运行一下:
要读懂代码,就需要MSDN Library 或 GDI+的帮助手册了。这里提供一个GDI+说明文档,当然还是先在MSDN中查看,实在查不到的再到文档里去找。
GDI+文档:http://wenku.baidu.com/view/9449de1cfe4733687e21aaac.html
运行的结果:
![](http://img.blog.csdn.net/20140624091046687?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd196X3pfMTk5MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](http://img.blog.csdn.net/20140624091108859?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd196X3pfMTk5MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
需要注意的是:
Image.Save函数不能覆盖源图像,可以在它的第三个参数中指代编码器参数,用于图像的质量、大小、变换的控制。
也许你学过OpenCV, 认为没什么困难,可以用一个putText函数搞定。博主一开始也这样天真,但是动手后才发现,OpenCV原生函数putText却是不支持中文字体的,想要实现这个功能,需要再动一番手脚。
这个故事告诉我们,理论和实践从来都不是一回事。
从网上搜集的资料来看,觉的可行的有两种方案:
下载FreeType库,参考:http://blog.sina.com.cn/s/blog_6bbd2dd101012dbh.html
利用Gdiplus,参考:/article/7017705.html
本质上两种都是一样的,就是调用库。由于看到FreeType库下载下来后还需要自己编译,就果断放弃了,等以后有时间,再用一下。
第一种方案(后来补上的):
终于有空,花了一段时间,研究了一下在OpenCV中如何把中文输出到图片上的方法,这里利用FreeType第三方库了,以及专门为在OpenCV中使用它而编写的接口文件,当然这个接口不是我写的,而且它还有待于进一步完善,不过,就目前的应用,它足够满足我的要求了FreeType库的下载地点:http://gnuwin32.sourceforge.net/packages/freetype.htm
可以下载编译好的安装包,也可以下载源文件自己编译,不过我想最好还是用现成的包吧,自己编译等有空有兴趣不妨搞一搞。
FreeType包的安装也很简单,和OpenCV的安装一样,用的时候需要在工程中进行相关配置,我的环境是VS2013+Win8.1+OpenCV2.4.8+FreeType2.3.5,我们新建一个C++控制台应用程序,并把OpenCV和FreeType配置好,OpenCV我就不多说了,只讲讲FreeType需要配置的路径,在VS2013项目属性中包含:
头文件包含目录:
安装根目录\GnuWin32\include
安装根目录\GnuWin32\include\freetype2
库文件包含目录:
安装根目录\GnuWin32\lib
链接器附加依赖项:freetype.lib
还有把 “安装根目录\GnuWin32\bin” 添加到环境变量PATH中,这和OpenCV是一样的,因为可能用到动态链接库。
这样FreeType就配置好了。
之后,在工程中添加下面的三个代码文件:cvxText.h、cvxText.cpp、test.cpp,当然运行所需要的图片文件和字体文件你要准备好放在程序能够找到目录下面,字体文件可以去C:\Windows\Fonts\下拷贝。之后编译运行,如果出现下面的错误提示:
错误 1 error C4996: 'fopen':This function or variable may be unsafe. Consider using fopen_s instead. To disable
deprecation, use_CRT_SECURE_NO_WARNINGS. See online help for details. d:\microsoft visual studio 12.0\opencv-2.4.8\opencv\build\include\opencv2\flann\logger.h 66
这是由于接口文件使用了较古老的c语言函数,可以通过在工程属性的编译器预处理器定义中加入_CRT_SECURE_NO_WARNINGS 项来抑制。
充分发挥你的复制粘贴能力对它们进行拷贝吧!
下面是输入结果图,用来欣赏:
当然,如果你对FreeType感兴趣,不妨去读读它的教程:
http://www.freetype.org/freetype2/docs/tutorial/step1.html
或者你可以完善一下那个接口文件,并写一篇类似的文章,以惠及更多的用户。
现在博主选择了第二种方案(第一次使用的方法):
还在用VC6.0的朋友需要先下载GdiPlus的包:http://download.csdn.net/detail/ldm6666/3236887VC6.0中需要做相应的配置,基本上就是在 工具|选项|目录 中包含 GdiPlus 下的 include 和 lib 文件夹路径 以及在 工程 中加入 Gdiplus.lib的库链接依赖项,使用动态链接库就需要把bin目录添加到系统环境变量中,大体上和OpenCV的配置相同。
使用VS2005以上的朋友就不用了,因为它已经包含在内了。下面就让我们用代码来说明一切,在IDE中新建空的控制台工程,并添加下面的代码进去,在工程目录下放一张名为 image.jpg的图片即可,运行一下:
要读懂代码,就需要MSDN Library 或 GDI+的帮助手册了。这里提供一个GDI+说明文档,当然还是先在MSDN中查看,实在查不到的再到文档里去找。
GDI+文档:http://wenku.baidu.com/view/9449de1cfe4733687e21aaac.html
运行的结果:
需要注意的是:
Image.Save函数不能覆盖源图像,可以在它的第三个参数中指代编码器参数,用于图像的质量、大小、变换的控制。
相关文章推荐
- Java图片文本识别工具Eye实现(不支持中文)
- MFC中将控件保存成图片 && MFC中利用GDI+在控件上绘图,把图像保存成图片
- 在MFC中用GDI+实现图片浏览的放大镜效果
- flying-saucer + iText + Freemarker实现pdf的导出, 支持中文、css以及图片
- C#将文本转换为图片,支持中文字符
- MFC+OPENCV实现JPEG图片的播放
- Python OpenCV实现图片上输出中文
- MFC使用OpenCV在文档窗口中显示图像(支持多图片格式)
- MFC实现工具栏插入图片和文本
- 学习笔记:MFC实现http协议传输图片和文本
- flying-saucer + iText + Freemarker实现pdf的导出, 支持中文、css以及图片
- JSP使用ckfinder实现中文图片上传后,无法显示,主要是tomcat不支持中文路径
- MFC GDI+实现以鼠标为中心缩放图片(并且可以拖动)
- MFC GDI+实现以鼠标为中心缩放图片(并且可以拖动)
- opencv学习笔记(二)vs2010+opencv2.3.1 mfc的实现---利用图片控件显示
- Python2.x上使用freetype实现OpenCV2.x的中文输出
- OpenCV中实现循环读图&&将当前图片写到某一个文件夹
- js读取本地文本,支持ie10以上和谷歌7以上(读取图片还未实现)
- Orx 字体图片生成工具完成 支持unicode,当然包括中文
- Android-->Android 原生支持圆角图片,圆角ImageView