你从来不会觉得,在图片上打上中文语句会有多么困难,除非你真正做过一次。
也许你学过OpenCV, 认为没什么困难,可以用一个putText函数搞定。博主一开始也这样天真,但是动手后才发现,OpenCV原生函数putText却是不支持中文字体的,想要实现这个功能,需要再动一番手脚。
这个故事告诉我们,理论和实践从来都不是一回事。
从网上搜集的资料来看,觉的可行的有两种方案:
本质上两种都是一样的,就是调用库。由于看到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/3236887
VC6.0中需要做相应的配置,基本上就是在 工具|选项|目录 中包含 GdiPlus 下的 include 和 lib 文件夹路径 以及在 工程 中加入 Gdiplus.lib的库链接依赖项,使用动态链接库就需要把bin目录添加到系统环境变量中,大体上和OpenCV的配置相同。
使用VS2005以上的朋友就不用了,因为它已经包含在内了。下面就让我们用代码来说明一切,在IDE中新建空的控制台工程,并添加下面的代码进去,在工程目录下放一张名为 image.jpg的图片即可,运行一下:
运行的结果:
需要注意的是:
Image.Save函数不能覆盖源图像,可以在它的第三个参数中指代编码器参数,用于图像的质量、大小、变换的控制。