GD.pmの例

GD.pmを使って画像をリサイズ。CentOSにGD.pmをインストールするには、事前に、yumrpmなどで、jpeg, png, zlib, freetype, Xpm(xorg-x11)のdevelパッケージをインストールしておくこと。

#!/usr/bin/perl -w

use GD;

$src_image = "foo.gif";
$dest_image = "bar.gif";

$RESIZE_WIDTH = 72;

my ($dev, $ino, $mode, $nlink, $uid, $gid,
 $rdev, $size, $atime, $mtime, $ctime, $blksize, $blocks)
        = stat($src_image);

open(SRC, $src_image) or die "Can not open $src_image : $!\n";
binmode(SRC);
sysread(SRC, $src, $size);
close(SRC);

write_resizeimage($dest_image, $src, "gif");

sub write_resizeimage {
    my($f, $d, $type) = @_;

    my $si = GD::Image->new($d);
    return "Not image format." unless $si;

    $si->transparent(-1) if $type =~ /gif|png/i; # to disable transparency

    my ($srcW, $srcH) = $si->getBounds();
    my ($destW, $destH) = resize_image($RESIZE_WIDTH, $srcW, $srcH);

    my $di = GD::Image->new($destW, $destH, 1);
    $di->copyResampled($si, 0, 0, 0, 0, $destW, $destH, $srcW, $srcH);

    open(F, "> $f") or die "Can not open $f : $!\n";
    binmode(F);
    if ($type =~ /jpe?g$/i) {
        print F $di->jpeg;
    } elsif ($type =~ /gif$/i) {
        print F $di->gif;
    } elsif ($type =~ /png$/i) {
        print F $di->png;
    }
    close(F);
}

sub resize_image {
    my($tw, $w, $h) = @_;
    my ($ratiow, $ratioh) = ($w, $h);

    if ($w > $tw) {
        my $ratio = $tw / $w;
        $ratiow = $ratio * $w;
        $ratioh = $ratio * $h;
    }
    return ($ratiow, $ratioh);
}

gdが2.0.28(?)以降だとgifの特許が切れた以降なのでgifも扱える。ただしこのソースでは透過gifは以下のようにして無効にしている。

$si->transparent(-1);