編集(管理者用) | 編集 | 差分 | 新規作成 | 一覧 | RSS | 表紙 | 検索 | 更新履歴

文字を画像に

文字列をPNG画像に変換する方法。Perlとgdライブラリを使用。

ウェブページにメールアドレスを掲載しているとSPAMの対象となるため、ひとつの案として「メールアドレスの文字列を画像にしてしまう」ということを思いついたのですが、処理すべきメールアドレスが大量にある場合にどうやって自動的に処理するかを考えていました。

CPANを探したところ、gdライブラリを扱うGDというモジュールがあり、それを使って文字列を画像として描画することができるようだったので、試してみて取り敢えずできたのが以下のスクリプト。

use strict;
use GD;

my $ttfont = '[An absolute path to the TrueType (.ttf) font file]';
my @mail = qw (
    the@inter.net
    strong@cyb.org
    interesting@sit.com
    please@more.info
    trouble@is.my.biz
);

foreach my $i (0 .. $#mail) {
    &string_to_png($mail[$i], "test$i.png", $ttfont);
}

sub string_to_png {
    my ($string, $png_file, $font) = @_;

    # 適当な大きさで画像を作る
    my $width = 10 * length($string);
    my $height = 20;
    my $im = new GD::Image($width, $height);

    # 背景色と文字色
    my $bg = $im->colorAllocateAlpha(255, 255, 255, 127);
    my $fg = $im->colorAllocate(0, 0, 0);

    # TrueType fontで文字を描画
    my @bounds = $im->stringFT($fg, $font, 9, 0, 0, 14, $string);

    # 画像中で文字が占める範囲とオフセットを取得
    my $srcx = $bounds[6];
    my $srcy = $bounds[7];
    my $oheight = $bounds[3] - $bounds[5];
    my $owidth = $bounds[2] - $bounds[0];

    # 出力用画像を別に作り、元画像から文字の部分のみをコピー
    my $outim = new GD::Image($owidth + 2, $oheight + 2);
    $outim->colorAllocateAlpha(255, 255, 255, 127);
    $outim->copy($im, 1, 1, $srcx, $srcy,  $owidth, $oheight);

    # 画像をファイルへ出力
    my $png_data = $outim->png(9);
    open (OUT, ">$png_file") or die;
    binmode OUT;
    print OUT $png_data;
    close OUT;
}