読者です 読者をやめる 読者になる 読者になる

画像からHTMLを生成するお絵かきPerl

Perl niconico

某witterで「■でハルヒとらき☆すた描いてみた」(アカウント無い方はこちらから)が話のタネになってた*1
見てもらえるとわかるけど、ExcelとかWordとかで絵を描くシリーズの1つで、VC++(かな?)で画像から■で画像を描画するHTMLを生成してる動画です。

動画見てたらタグに「.cでくれ」って書いてあったんで、カッとなってPerlで書いてみた。今ではかなり反省している。
square_draw.pl

#!/usr/bin/perl -w

use warnings;
use strict;
use utf8;
binmode STDOUT, ":utf8";
use Image::Magick;

my($file,$size);
if (@ARGV > 0) {
    $file = $ARGV[0];
    $size = $ARGV[1] || 4;
    $size .= "px";
}else {
    die "Usage:$0 Image_File [Pixel_Size]\n";
}

my $image = Image::Magick->new;
$image->Read($file);

my $width = $image->Get('width');
my $height = $image->Get('height');

print "<html><head>\n";
print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n";
print "<style type=\"text/css\">body {font-size: $size;line-height:100%;}</style>\n";
print "</head>\n";
print "<body>\n";
for (my $i=1; $i<=$height; $i++) {
    for (my $j=1; $j<=$width; $j++) {
        my ($r, $g, $b, $ugh) = split ',', $image->Get("pixel[$j,$i]");
        $r = unpack("H2", pack("C", int($r/256)));
        $g = unpack("H2", pack("C", int($g/256)));
        $b = unpack("H2", pack("C", int($b/256)));
        print "<font color=\"#$r$g$b\">■</font>";
    }
    print "<br />\n";
}
print "</body></html>\n";

undef $image;
exit;

使い方は、

$ ./square_draw.pl 元の画像ファイル 表示する■のサイズ(px)

って感じ。サイズは指定しないと勝手に4pxになります。

サンプルはこんなかんじ(700kBくらいあるのでご注意ください。ちなみに元画像は150x150pxの5kB程度のjpgです。)
注意点:Firefoxだと「最小フォントサイズ」って設定があるのでこれを「なし」にしないとうまく見えません。

コード書いてた時間よりもcygwinでImage::Magick使おうとして嵌ってた時間の方がずっと長いのは内緒。 しかも最終的に動かなくてActivePerl入れました。インストールは
Image::Magick を使って大量画像のサムネイル画像を一括自動生成 :: Drk7jp
を参考にさせていただきました。
ただし、ImageMagickのインストール時にActivePerl用のPerlMagickを入れるっていうのにチェックを入れないとファイルが生成されないので注意。あと、インストールするのはdll版だけで大丈夫でした。

*1:話題になってたわけじゃない