PERL image resize script

nha, elkezdem már a blogot is, ha már van...
elsőnek akkor megosztom a perl-ben írt kép kicsinyítő kódomat.
nem túl bonyolult, de valakinek hasznára lehet.
elsősorban azért írtam, hogy ugye, ha valaki pl képeket akar felrakni a netre, akkor az esetek többségében szüksége van valamilyen thumbnail-ekre. ezeket lehetett manuálisan kicsinyíteni(pl paint, photoshop), vagy egyébb más emberek álltal megírt progikkal kicsinyíteni. na hát én nézegettem más progikat, de egyik se volt kedvemre való(ezért biztos kapom majd az ívet, hogy "dehülyevagyok"), és amúgy is volt suliban PERL órám, így írtam egy ilyet gyakorlásképp.
még annyit, hogy szükséges a script lefuttatásához egy image::size modul. amint azt a sciptben is látni fogjátok, erre nem azért van szükség, hogy kicsinyítsek(arra ott a convert), hanem hogy a méretüket megállapítsam, meg ilyenek.
tehát a script:


#! /usr/bin/perl -w
use strict;
use Image::Size;

#változók:
#@all		fileneveket tárolja listában, ha jpg-k
#$fn		filename
#$kit		kiterjesztés
#$cs		számláló az egyenlőségjelek kiiratásához
#$meret		az új file mérete(string)
#$c_x		célfile X mérete(szélessége)
#$c_y		célfile Y mérete(magassága)
#$orig_size	string - az eredeti kép mérete: 1234x1234
#$f_x		forrásfile X mérete
#$f_y		forrásfile Y mérete
#$arany		forrásfile szélesség-magasság aránya
#$i		változó az foreach ciklushoz, ami mindig a @all sorait veszi fel
#$l		változó, amit csak az [enter]-ek leütésére használtam (tovább...)
#$ff		forrásfile neve (név.kit)
#$cf		célfile neve (név.kit)
#$s		számláló az elejéhez, az egyenlőségjelek kiiratásához, valamint a file lista elkészítéséhez
#@ft		filetype (png, jpg, jpeg, JPG, bmp)
#@other		(egyenként a filetípusok cuccai)

#===============================HELP FILE kiiratása
my $s=0;
system("clear");
print '=' x 80, "\n";
open FH,"help";
print <FH>;
close FH;
print '=' x 80, "\n";
print "[enter] => tovább";
my $l=<STDIN>;
system("clear");

#===============================Lista elkészítése
$s=0;
my @ft=("jpg","JPG","jpeg","bmp","gif","psd","pcd");
my @all = `ls | grep png`;
#my @others=();
foreach $s(@ft){
	my @other = `ls | grep $s`;
	push(@all,@other)
	
}

#===============================ha nincs kép a könyvtárba, akkor meg is áll
chomp(@all);
if (!@all) {
	print "nincs semmi sem a könyvtárban!!!\n";
	exit;
}

#===============================deklaráció, szélesség bekérése
my ($fn,$kit,$meret,$ff,$cf,$orig_size,) = ("","","","","","");
my ($f_x,$f_y,$arany,$c_y,$i,$cs) = (0,0,0,0,0,0);
print '=' x 80, "\n";
print "kérem a célfile szélességét pixel-ben ([enter] - 400px): ";
my $c_x=<STDIN>;
print '=' x 80, "\n";

#===============================ha a $c_x üres, akkor 400-ra állítja az értékét(default)
chomp($c_x);
$c_x=(!$c_x)?400:$c_x;

#===============================FORMÁZOTT LISTA KÉSZÍTÉSE
print "a következő fileok lesznek konvertálva:\n";
print '=' x 80, "\n";

format STDOUT_TOP =
	file-név	        tipus   méret             konvertált méret
	------------------------------------------------------------------
.

format STDOUT =
	@<<<<<<<<<<<<<<<<<< @|||||||||| @<<<<<<<<<<<<<<<< @<<<<<<<<<<<<
	$fn,        	    $kit,	$orig_size,	     $meret
.

#===============================KIIRATÁS A FORMÁZOTT LISTÁBA
foreach $i(@all) {
	($fn,$kit) = split(/\./,$i);
	$ff = $fn.".".$kit; 
	$cf = $fn."_".$c_x."x".$c_y.".".$kit;
	($f_x, $f_y) = imgsize($ff);
	$orig_size = $f_x."x".$f_y;
	$arany = $f_x/$f_y;
	$c_y = int($c_x/$arany);
	$meret = $c_x."x".$c_y;
	write;
}

#===============================ha a listával nincs gond, akkor vár egy billentyűlenyomásra
print '=' x 80, "\n";
print "[enter] => tovább";
$l=<STDIN>;

#===============================tényleges konvertálás
print '=' x 80, "\n";
$i=0;
foreach $i(@all) {
	($fn,$kit) = split(/\./,$i);
	$ff = $fn.".".$kit;
	$cf = $fn."_".$c_x."x".$c_y.".".$kit;
	#el kell dönteni, hogy hány tabulátor kell
	if ($ff =~ /.{,7}/) {print "\t".$ff."\t\t\t"."=>"."\t".$cf."\n";} elsif ($ff =~ /.{22,}/){
		print "\t".$ff."\t"."=>"."\t".$cf."\n";
	} else {
		print "\t".$ff."\t\t"."=>"."\t".$cf."\n";
	}
	system("convert -geometry \'".$c_x."x".$c_y.">\' ".$ff." ".$cf);
}

#===============================VÉGE
print '=' x 80, "\n";
print "kész....[enter]=>vége";
$l=<STDIN>;

ennyi. nem is bonyolult:D

források:
image::size modul
a forrás és a modul csomagolva

kritikát(+/-), hozzászólást szivesen fogadok.:D

Hozzászólások

Nekem ezt javasoltak:

http://michael.hahsler.net/pix2tn/

Csak imagemagick kell neki.
A scriptet meg azon belul a html kodot egyszeruen at lehet alakitani, hogy milyen szineket, elrendezest, thumbnail-meretet, formatumokat stb. hasznaljon.

A fentivel ellentetben a parametereket nem lehet opciokent megadni, de az nalam nem is fontos (dvd-re kiirt kepekhez generalok vele katalogust).

Haaat... Ha a kollegak ilyen kodot irnanak darabokra szednem oket, kulonosen a backtick-es kulso programok miatt :) Ezt amugy hol tanitjak: 'foreach $cs(1..80){print "=";} print "\n";' ??? Kicsit tomorebb verzio: print '=' x 80, "\n";

öröm olvasni egy kis perlt:D
most tanulom autodidaktán: oldogatom a Project Euler feladatait, ahhoz használok elég gyakran perl-t... Pedig konkrétan semmi tapasztalatom/előéletem nincs vele:)
(off: ettől függetlenül ízlés szerint oldogatom a feladatokat még c, javascript, php, python nyelveken. Az elején rubyval is próbálkoztam, de aztán leszoktam róla:D)
—-—-—

int getRandomNumber() {
return 4;	//szabályos kockadobással választva.
	       //garantáltan véletlenszerű.
}	      //xkcd