GD.pmの例
GD.pmを使って画像をリサイズ。CentOSにGD.pmをインストールするには、事前に、yumやrpmなどで、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);