A feladat: egy adott képfile átméretezése úgy, hogy a létrejövő kép egy előre megadott méretű téglalapba beférjen, és ne torzuljon (tartsa meg a méretarányait). Lehetőleg a script minél több formátumot ismerjen.
Mellébeszélés helyett lássuk egyből a kódot!
Thumbnail Generator
use strict;
use Image::Magick;
# szelesseg, magassag definicio, file-ok megadasa
my (
$width,
$height,
$infile,
$outfile) = (
160,
160,
'./kep.jpg',
'./ujkep.png');
# object letrehozasa, kep beolvasasa
my $im =
Image::Magick->new;
my $read =
$im->
Read(
$infile);
$read &&
die(
$read);
# EREDETI szelesseg, magassag beolvasasa
my (
$w,
$h) =
$im->
Get(
'width',
'height');
print "Beolvasva: $infile. Meret: $w x $h\n";
# Aranyok megallapitasa, uj meret kiszamitasa
my (
$neww,
$newh);
if (
$w/
$h >
$width/
$height) {
$neww =
$width;
$newh =
int(
$h * (
$neww/
$w));
}
else {
$newh =
$height;
$neww =
int(
$w * (
$newh/
$h));
}
print "Az uj meret: $neww x $newh\n";
# Tenyleges atmeretezes, kimentes
$im->
Resize(
'width' =>
$neww,
'height' =>
$newh);
$im->
Write(
$outfile);
print "Kesz.\n";
Ez a kód meglehetősen "kiherélt", mindössze a minimális dolgokat tudja. A felhasznált képmanipuláló modul az
ImageMagick, amely véleményem szerint az egyik legjobb képmanipuláló csomag (egy C library-ról van szó, amihez a Perl modul csak egy binding).
A képet beolvassuk, méretarányai szerint kiszámoljuk a thumbnail méretét, majd kicsinyítünk. Akkor is átméretezünk, ha "nem kell", vagyis ha a forráskép eleve kisebb, mint a megadott téglalap - házi feladat, hogy ez ne így legyen

.
Ja, és igen: az ImageMagick igazából egyetlen utasítással is tud thumbnail-t készíteni, de ezzel most ne törődjünk