用ImageMagick在图片中写中文的问题及解决

最近要用ImageMagick做个水印效果,先做一个简单版本,往图片里添加文字注释
安装ImageMagick和ghostscript(不装会报错:sh:gs:command not found)
如果是linux -- CentOS的系统,只需要yum install ghostscript,yum install imagemagick即可

当然,下载源码包安装很可以,而且可以安装最新版,例如ImageMagick已经6.3.9-6了

装完在命令行下convert --version看看其版本,并且验证是否安装成功,然后取张图片试试效果:

convert -rotate 90 xxx.jpg out.jpg

是不是旋转了?

往图片上输入文字:

convert -font helvetica -fill white -pointsize 13 \
-draw 'text 5,195 "Floriade 2002, Canberra, Australia"' \
floriade.jpg comment.jpg

意思是用helvetica字体,white颜色,13字体大小,在图片的width5,height195初开始写上双引号中的句子。

如果要写在正中心呢?有选项gravity,设置为Center就是正中心啦,设为SouthWest就是左下角,非常方便。

以上是命令行,安装了Perl的Image::Magick模块之后,就可以用Perl来调用ImageMagick了,然后问题就是:如何写入中文?ImageMagick只支持utf8编码这是文档上就写明的,不过我测试如下代码:

#!/usr/bin/perl -w
use strict;
use Image::Magick;
use Image::Size;
    my $src_path = "tutu.jpg";
    my $store_path = "tutu_comment.jpg";
    my ($width,$height) = imgsize($src_path);
    my $pointsize = int($height * 0.07);
    my $text = '中文在此!';
    my $rh_annotate = {
        text => $text,
        style => 'Normal',
        pointsize => $pointsize,
        fill => 'white',
        gravity => 'SouthWest',
    };
    my $image = Image::Magick->new();
    $image->Read($src_path);
    $image->Annotate(%$rh_annotate);
    $image->Write($store_path);
    undef $image;


居然是乱码效果!!我用的是EmEdit编辑器,该文件是保存为utf-8未签名格式的,但就是乱码!
几经测试,终于发现。。。需要一个中文字体文件的支持。
在windows上可以找到很多,c:\windows\fonts\目录下,仿宋、黑体、隶书等等都可以,这种ttf的文件copy到linux上一样有用,只需要指定font的位置即可

修改代码如下:

    my $rh_annotate = {
        text => $text,
        font => 'fonts/simfang.ttf',
        style => 'Normal',
        pointsize => $pointsize,
        fill => 'white',
        gravity => 'SouthWest',
        encoding => 'UTF-8',
    };

OK!测试通过!写出了仿宋字体的中文。

另外,如果你用的是UltraEdit,EditPlus等不支持编码格式的编辑器,那默认是gb2312的编码,需要转码才能写中文:

use Encode;
$text = encode('utf8',decode('gbk',$text));

这样就可以了,具体转码问题这里不多说了,详见Perl的Encode模块。

另外再提供给大家一些ImageMagick的经典文档:

http://www.imagemagick.org/Usage/text/

http://www.imagemagick.org/script/perl-magick.php

http://bbs.zdnet.com.cn/thread-37859-1-1.html

呵呵,希望对大家有帮助,少走歪路(我自己在写中文问题上堵了很久,一直以为是编码问题,太傻了)

你可能感兴趣的:(linux,windows,PHP,centos,perl)