概要

  • 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

リンク