ImageMagick Revisited

นั่งเขียน Perl Script ที่เรียกใช้ ImageMagick อีกที เพื่อจะย่อรูป/ทำกรอบ/แต่งรูปเล็กน้อย (Auto contrast/Unsharp Mask)
จริงๆ มันมี Module PerlMagick ให้ใช้ด้วย แต่ขี้เกียจดู
ตอนแรกว่าจะเขียนด้วย Batch file แต่ข้อจำกัดเยอะมาก

หา Option ใหม่ได้คือ

  • -equalize แต่ใช้แล้วสีเพี้ยน ยังหาวิธีแก้ไม่ได้
  • -gamma ใช้แล้วสว่างไปหน่อย
  • -encoding เซ็ตเป็น UTF-8 หรือ SJIS อะไรงี้ได้ แต่ภาษาไทยต้องใช้ UTF-8 เท่านั้น

เรื่องของเรื่องคืน ขี้เกียจมานั่งปรับ Photoshop ทีละอัน
แล้ว Action ใน Photoshop มันก็ไม่ยืดหยุ่นด้วย

Link อ้างอิงที่น่าสนใจ

ตัวโปรแกรมตั้งชื่อว่า batchframe.pl
คุณสมบัติคือ
– Normalize histogram
– ถ้าใช้ Option -eq ก็จัดการใช้ -equalize เวลาเรียก convert ของ ImageMagick ด้วย
– ย่อรูป
– Crop รูป
– Unsharp Mask
– ทำกรอบสีขาว
– มุมล่างขวาใส่ Copyright text
– ถ้าใช้ Option -text “any text” ที่มุมล่างซ้ายก็ใส่ custom text ด้วย

* Detect ได้ด้วยว่าเป็นรูปแนวตั้งหรือแนวนอน
** Setting อื่นๆ อย่างขนาดภาพที่ต้องการ หรือ Font นี่ แก้เองใน Script

#!/usr/bin/perl

#!/usr/bin/perl

# fix for Windows only
use File::Glob qw(:glob);
use POSIX qw(ceil floor);

$usage = "usage: batchframe.pl [-eq] [-lev black,white] [-gam gamma] [-sat saturation] [-nonorm] [-text \"Text\"] filename\n";

$equalize = 0;
$fullmajorsize = 1024;
$fullminorsize = floor($fullmajorsize * 3 / 4);
$borderratio = 2.5;
$inborder = 2;
$border = floor($fullmajorsize * 2.5 / 100);
$size = $fullmajorsize - ($border * 2);
$minorsize = $fullminorsize - ($border * 2);
$fontsize = floor($border * 0.75);
$border -= $inborder;
$type = "Bookman-Old-Style";
$outputdir = "edited";
$unsharp = $fullmajorsize * 0.500 / 100;

$norm = "-normalize";
$equalize = "";
$modulate = "";
$gamma = "";
$level = "";

while($#ARGV > 0) {
	if($ARGV[0] eq "-eq") {
		$equalize = "-equalize";
		shift @ARGV;
	} elsif($ARGV[0] eq "-nonorm") {
		shift @ARGV;
		$norm = "";
	} elsif($ARGV[0] eq "-text") {
		shift @ARGV;
		$text = shift @ARGV;
	} elsif($ARGV[0] eq "-sat") {
		shift @ARGV;
		$sat = shift @ARGV;
		$modulate = "-modulate 100,$sat";
	} elsif($ARGV[0] eq "-lev") {
		shift @ARGV;
		$level = shift @ARGV;
		$level = "-level $level";
	} elsif($ARGV[0] eq "-gam") {
		shift @ARGV;
		$gam = shift @ARGV;
		# pantip post = 1.2
		$gamma = "-gamma $gam";
	} elsif($ARGV[0] eq "-h") {
		print $usage;
		exit(0);
	}
}

if($#ARGV == 0 && $ARGV[0] =~ /^-/) {
	print $usage;
	exit(0);
}

if($#ARGV < 0) {
	print $usage;
	exit(0);
}

print "target size = ${fullmajorsize}x${fullminorsize}\n";
print "border = $border\n";
print "size (w/o border) = ${size}x${minorsize}\n";
print "font = $type $fontsize\n";
print "unsharp = $unsharp\n";
print "text = $text\n" if($text ne "");
print "saturation = $sat%\n" if($sat ne "");
print "do not apply -normalize\n" if($norm eq "");
print "apply -equalize\n" if($equalize ne "");
print "$level\n" if($level ne "");
print "gamma = $gam\n" if($gamma ne "");

if(! -e $outputdir) {
	mkdir $outputdir;
}

# Normal way to do
# foreach $_ (@ARGV) {

# fix for Windows only
foreach $_ (bsd_glob($ARGV[$#ARGV], GLOB_NOCASE)) {
	$in = $_;
	$out = $outputdir."\\".$in;

	$width = `identify -format "%w" $in`;
	chomp($width);
	$height = `identify -format "%h" $in`;
	chomp($height);

	#print "${width}x${height} ";
	if($width > $height) {
		#print "lanscape\n";
		$cropstring = " -crop ${size}x${minorsize}-0-0 ";
	} else {
		#print "portrait\n";
		$cropstring = " -crop ${minorsize}x${size}-0-0 ";
	}

	$convertcmd = "convert $in $norm $gamma $modulate $level $equalize -resize ${size}x$size $cropstring -unsharp $unsharp -bordercolor black -border $inborder -bordercolor white -border $border -gravity southeast -font $type -pointsize $fontsize -fill black -annotate 0x0+$border+2 \"© Oakyman - Issara Thienlikit\" -gravity southwest -annotate 0x0+$border+2 \"$text\" $out
";
	print "$in --> $out\n";
	`$convertcmd`;
}

เอาหละ เตรียม Upload รูปที่แต่งแล้วขึ้น Fotki

62 thoughts on “ImageMagick Revisited”

Leave a Reply

Your email address will not be published. Required fields are marked *