概要
- GDライブラリを使って画像の 1/2, 1/3, 1/4 縮小版を一括で作成する。
スクリプト
shrink.pl
# 画像一括縮小
# 「PDATA」以下のpngファイルを1/2,1/3,1/4に縮小し「PDATA2」「PDATA3」「PDATA4」へ保存する。
use strict;
use warnings;
use utf8;
use GD;
my @filelist = <./PDATA/*.png>;
# print join( "\n", @filelist );
my $filein; # 入力ファイル名
my $imgsrc; # 入力画像
my( $width, $height ); # 入力画像の幅と高さ
my $num; # 画像ファイル数
my $cnt = 0; # カウンタ
$num = scalar( @filelist );
$| = 1;
foreach $filein ( @filelist ){
$imgsrc = GD::Image->new( $filein ) || die( $! );
( $width, $height ) = $imgsrc->getBounds();
shrink( $filein, 2 );
shrink( $filein, 3 );
shrink( $filein, 4 );
printf STDERR ( "%d/%d\r", ++$cnt, $num );
}
$| = 0;
sub shrink
{
my( $filein, $div ) = @_;
my $fhout; # 出力ファイルハンドル
my $imgdst; # 出力画像
my( $w2, $h2 ); # 出力画像の幅と高さ
my $fileout; # 出力ファイル名
$w2 = int( $width / $div ); # intが無いとクラッシュする
$h2 = int( $height / $div ); # intが無いとクラッシュする
$imgdst = new GD::Image( $w2, $h2, 0 );
$imgdst->copyResized( $imgsrc, 0, 0, 0, 0, $w2, $h2, $width, $height );
$fileout = $filein;
$fileout =~ s#/PDATA/#/PDATA${div}/#;
open( $fhout, ">:bytes", $fileout ) || die( $! );
binmode( $fhout ); # ">:bytes" があればいらないはずだが、無いと読めないファイルが出来る。
print $fhout $imgdst->png;
close( $fhout );
}
# EOF