CGI-BBS > 画像処理 > ImageMagick > ImageMagickについて日本語の文字を画像に合成したいしたい。


カレッヂ
カレッヂ


質問者 初心者  投稿日 10/16(木) 17:23:46
Linuxサーバ(TurboLinux8WS プロモ版)にImageMagick 5.5.7-10をインストールしました。
Annotateを使って、日本語の文字を画像に合成したいのですが、うまくいきません。
検索してみたのですが、たどり着けませんでした。

合成はPerlMagickからです。

どなたか、成功された方はいませんでしょうか?
Perlのサンプルスクリプトや、
参考になる事を教えていただけないでしょうか?

よろしくお願いします。

プロバイダ参照:自宅サーバ
サーバのOS:UNIXサーバ
パソコンのOS:WinNT系
エディタ:
FTPソフト:
サーバ移転:していない
改造:していない
CGI習熟度:middle

回答者 やまだ  [削除]  投稿日 10/18(土) 01:16:51
Here we annotate an image with a Taipai TrueType font:

    $text = 'Works like magick!';
    $image->Annotate(font=>'kai.ttf', pointsize=>40, fill=>'green', text=>$text);

(by http://www.imagemagick.org/www/perl.html)

からして、fontをきちんと指定してやれば、なんとかうまくいくと思います。
(
RedHat Linuxの漢字フォントがどこにあるかは、よく知りませんが、たぶん、
/usr/X11R6/lib/X11/fonts/TrueType
あたりかと。(watanabe,wadalab,kochiの使用には注意。(苦笑))
)

わたしは、GD2のannotateでうまく出力できますよ。
質問者 初心者  [削除]  投稿日 10/18(土) 02:07:05
やまだ 様 回答ありがとうございます。

色々やっていて、ご指摘いただいた、フォントの指定は上手くいったと思われます。
(フォントを指定して、半角英数字の表示に成功しています。)
ただ、表示文字を日本語(全角)にすると、文字化けしてしまいます。
エンコードが問題かと思って、色々試したのですが、もっとも有効だと思われる
UTF-8のエンコードをさせると、文字は表示されなくなります。

>わたしは、GD2のannotateでうまく出力できますよ。
GD2が何かも分かってないのですが、助言ありがとうございます。
一応gdとGD.pmを入れて、Perlからやってみようと思ってました。
今から調べて試してみようと思います。

ありがとうございました。
回答者 かば  [削除]  投稿日 10/24(金) 11:04:30
初心者さま、やまださま、横から失礼します。

私もPerlMagickで半角英数は合成できるのに、全角は表示できずに困っています。
コードはこんな感じです。

use Image::Magick;
use Encode qw/ from_to /;

my $i = Image::Magick->new;
$i->Read("sample.jpg");
$text = 'あいうえお';
from_to( $text, 'euc-jp', 'utf8' );

$stat = $i->Annotate(
    encoding=>'UTF-8',
    font=>'kochi-gothic.ttf',
    text=>$text,y=>20,stroke=>'red', pointsize=>'16');
$i->Write("addtext.jpg");

from_toの戻りを見ると変換できていそうだし、Annotateもエラーは返してません。
出力先のjpgは元の画像と同じ絵のまま。
"aaa"は合成できるのに、"あいうえお"が合成できないなんて...
その後どうなりましたか?

サーバー:RedHat 8.0 と付属のApache
Perl: 5.8.0
転送なし
エディタ: vi
ImageMagic: 5.5.7
質問者 初心者  [削除]  投稿日 10/25(土) 07:14:14
かば様 やまだ様
その後の状況をご報告します。

まず、結論からいうと。Image::Magickでの日本語表示はあきらめました。
自分の使ってたコードはこんな感じです。
use strict;
use Jcode;
use Image::Magick;

print ("Content-type: image/png\n\n");
binmode STDOUT;

my $image = Image::Magick->new;
$image->Set( size => "300x300" );
$image->ReadImage( "xc:black" ); 

my $text = '日本語';
#my $text = 'ABCDEFG';

my $text1 = jcode($text)->euc;
my $text2 = jcode($text)->sjis;
my $text3 = jcode($text)->jis;
my $text4 = jcode($text)->ucs2;
my $text5 = jcode($text)->utf8;

my $font = "*****.ttf";

$image->Annotate(text=>$text1,x=>50,y=>50,stroke=>'red', undercolor=>'white', pointsize=>16, encoding=>'UTF-8', font=>$font );
$image->Annotate(text=>$text2,x=>50,y=>100,stroke=>'green', pointsize=>16, encoding=>'UTF-8', font=>$font );
$image->Annotate(text=>$text3,x=>50,y=>150,stroke=>'green', pointsize=>16, encoding=>'UTF-8', font=>$font );
$image->Annotate(text=>$text4,x=>50,y=>200,stroke=>'green', pointsize=>16, encoding=>'UTF-8', font=>$font );
$image->Annotate(text=>$text5,x=>50,y=>250,stroke=>'red', pointsize=>16, undercolor=>'white',encoding=>'UTF-8',font=>$font );
#$image->Annotate(text=>$text,x=>50,y=>50,stroke=>'green', pointsize=>16, encoding=>'UTF-8');
$image->Write("png:-");
print "\n\n";
undef $image;

やはり半角文字は表示するけど、全角文字はだめです。
Fontの指定は成功しているようなのですが、上手くいきません。
ImageMagickの公式を探すと、BBSに日本人の方がannotate.cを修正して成功したような
ことが書いてあるんですが、自分には少し無理でした。

で結局。以前書いたようにgd入れて、GD.pm入れてPerlから日本語を表示させることに
成功しました。フォントはみかちゃんフォントを使いました。

なんとか使えているので、とりあえずこれで行くことにしました。
ご参考になれば幸いです。

サーバー:TurboLinux8 Apache
Perl: v5.6.1
ImageMagic: 5.5.7-10
回答者 やまだ  [削除]  投稿日 10/25(土) 07:32:51
わたしがやったときは、フルパスを指定したフォントを使いました。
utf8の指定のテストはまだやってません。
回答者 かば  [削除]  投稿日 10/25(土) 17:50:17
やまださま、初心者さま。

出ました!
やまださまのご助言のとおり、フォントパスをフルパスにしたら、ちゃんと出ました!
ありがとうございます。
fonts.dirとfonts.aliasがちゃんとしてれば良いのかと思っていたので盲点でした。
以下、修正箇所です。

$stat = $i->Annotate(
    encoding=>'UTF-8',
    font=>'@/usr/share/fonts/ja/TrueType/kochi-gothic.ttf',
    text=>"$text2",y=>20,stroke=>'red', pointsize=>'22');

※東風フォントは著作権問題があるようなので実際には使いませんが、これはテストなので。

お騒がせしました。
質問者 初心者  [削除]  投稿日 10/26(日) 01:23:33
かば様 やまだ様

いろいろありがとうございます。
こちらでも日本語表示ができました。

やまだ様のスクリプト
   font=>'@/usr/share/fonts/ja/TrueType/kochi-gothic.ttf',
を参考にフルパス指定したら上手く表示されました。

お騒がせいたしました。

一応解決を見たのでこのスレッドは閉じさせていただきます。
ありがとうございました。

このページは終了したので返信(回答)は書きこめません
 


Web裏技