GD και ImageMagick όταν τα χρειάζεστε#
Το Imager είναι η προεπιλογή, αλλά αξίζει να γνωρίζετε άλλες δύο βιβλιοθήκες raster. Το GD είναι παλαιότερο, μικρότερο και πανταχού παρόν: ένα μεγάλο μέρος της υπάρχουσας Perl σχεδιάζει με αυτό, και το μοντέλο ευρετηρίου χρωμάτων του αξίζει να το κατανοήσετε ακόμη και αν δεν το επιλέξετε ποτέ για κάτι νέο. Το ImageMagick, μέσω του Image::Magick, είναι το βαρέων βαρών: η ευρύτερη υποστήριξη μορφών και ο βαθύτερος σάκος μετασχηματισμών, με κόστος μια μεγάλη εξάρτηση. Αυτό το κεφάλαιο δείχνει το καθένα, και λέει πότε νικά το Imager.
GD#
Το GD τυλίγει το libgd. Η καθοριστική ιδιοτροπία του είναι το ευρετήριο χρωμάτων: σε μια κλασική εικόνα (παλέτας) δεσμεύετε κάθε χρώμα μία φορά και έπειτα σχεδιάζετε με τον ακέραιο δείκτη που επιστρέφει, όχι με το ίδιο το χρώμα. Αυτό είναι ένα κατάλοιπο των εικόνων GIF των 256 χρωμάτων, και εξακολουθεί να φαίνεται στο API παρότι οι εικόνες truecolor είναι πλέον ο κανόνας.
use GD;
# the third argument requests a truecolor image; omit it for palette
my $im = GD::Image->new(200, 200, 1);
# even on truecolor, colors come from colorAllocate
my $white = $im->colorAllocate(255, 255, 255);
my $blue = $im->colorAllocate(0, 0, 255);
my $red = $im->colorAllocate(255, 0, 0);
$im->filledRectangle(0, 0, 199, 199, $white);
$im->line(0, 0, 199, 199, $blue);
Τα πρωτογενή είναι θεσιακά, και δύο από αυτά διαφέρουν από αυτό που ίσως περιμένετε. Τα arc και ellipse παίρνουν ένα κέντρο συν πλάτος και ύψος (τις πλήρεις εκτάσεις, όχι μια ακτίνα), και γωνίες σε μοίρες:
# center (100,100), 80 wide, 80 tall, full circle
$im->arc(100, 100, 80, 80, 0, 360, $blue);
$im->filledArc(100, 100, 120, 60, 0, 180, $red); # a filled half-ellipse
$im->rectangle(10, 10, 60, 60, $blue);
$im->filledRectangle(140, 10, 190, 60, $red);
$im->setPixel(100, 100, $blue);
$im->fill(30, 30, $red); # flood fill
Τα πολύγωνα σχεδιάζονται από ένα αντικείμενο GD::Polygon, όχι από ακατέργαστες συντεταγμένες:
my $poly = GD::Polygon->new;
$poly->addPt(50, 10);
$poly->addPt(150, 10);
$poly->addPt(100, 90);
$im->polygon($poly, $blue);
$im->filledPolygon($poly, $red);
Η έξοδος είναι μία μέθοδος ανά μορφή που επιστρέφει τα κωδικοποιημένα bytes, οπότε τα εκτυπώνετε σε ένα filehandle μόνοι σας:
open my $fh, '>', 'out.png' or die $!;
binmode $fh;
print $fh $im->png; # or ->jpeg($quality), ->gif
close $fh;
Πότε νικά το GD: συντηρείτε κώδικα που ήδη το χρησιμοποιεί (ένα μεγάλο μέρος της παλαιότερης Perl το κάνει), θέλετε τη μικρότερη εξάρτηση που εξακολουθεί να σχεδιάζει, ή χρειάζεστε συγκεκριμένα η συμπεριφορά του libgd να ταιριάζει με ένα άλλο εργαλείο σε μια σωλήνωση που επίσης χρησιμοποιεί libgd. Για νέα δουλειά σχεδίασης χωρίς τέτοιον περιορισμό, το API ονομασμένων χρωμάτων και ορισμάτων hash του Imager είναι πιο φιλικό και το σύνολο φίλτρων του πλουσιότερο.
ImageMagick (Image::Magick)#
Το Image::Magick, που ονομάζεται και PerlMagick, αποστέλλεται μαζί με το ίδιο το ImageMagick και εκθέτει την πλήρη μηχανή του. Τα δυνατά του σημεία είναι το εύρος μορφών (διαβάζει και γράφει μορφές που δεν αγγίζει τίποτα άλλο στο CPAN) και οι μετασχηματισμοί (εκατοντάδες πράξεις από Resize και Blur έως Distort, Morphology και κόλπα ειδικά για κάθε μορφή). Η αδυναμία του είναι η εξάρτηση: χρειάζεστε μια αντίστοιχη βιβλιοθήκη ImageMagick εγκατεστημένη, και είναι μεγάλη.
Το API είναι προσανατολισμένο στα ρήματα: δημιουργείτε ένα αντικείμενο, το διαβάζετε με Read ή το διαστασιολογείτε, και έπειτα καλείτε ονομασμένες πράξεις, καθεμία από τις οποίες επιστρέφει μια συμβολοσειρά σφάλματος που είναι κενή σε επιτυχία.
use Image::Magick;
my $im = Image::Magick->new;
$im->Set(size => '200x200');
$im->ReadImage('canvas:white'); # a blank white canvas
# drawing is one Draw call per primitive, SVG-path-like
$im->Draw(primitive => 'line', points => '0,0 199,199',
stroke => 'blue');
$im->Draw(primitive => 'circle', points => '100,100 100,40',
stroke => 'red', fill => 'none');
$im->Draw(primitive => 'polygon', points => '50,10 150,10 100,90',
fill => 'skyblue');
# transformations are named methods
$im->Blur(radius => 0, sigma => 1.5);
$im->Resize(geometry => '100x100');
my $err = $im->Write('out.png');
warn "$err" if $err;
Το πρωτογενές circle παίρνει το κέντρο ακολουθούμενο από οποιοδήποτε σημείο στην περίμετρο (οπότε το 100,100 100,40 είναι κέντρο (100,100) με ακτίνα 60), που είναι η σύμβαση του ImageMagick αντί για ακτίνα. Κάθε όρισμα γεωμετρίας είναι η μικρογλώσσα συμβολοσειρών του ImageMagick ('200x200', '100x100+10+10'), οπότε αξίζει μια ματιά στην τεκμηρίωση γεωμετρίας του ίδιου του ImageMagick για τις λεπτομέρειες.
Πότε νικά το ImageMagick: χρειάζεστε μια μορφή που δεν διαβάζει τίποτα άλλο, κάνετε βαριά ομαδική μεταμόρφωση (δημιουργία μικρογραφιών χιλιάδων αρχείων, σωληνώσεις μετατροπής μορφών), ή θέλετε μία από τις πολλές πράξεις του που θα ήταν ένα ολόκληρο έργο να ξαναϋλοποιηθεί. Για διαδραστική σχεδίαση ή ένα στενό αποτύπωμα εξαρτήσεων, είναι περισσότερη μηχανή από όση χρειάζεστε, και το Imager ή το GD ταιριάζουν καλύτερα.
Επιλογή#
Θέλετε … | Καταφύγετε σε |
|---|---|
Νέα σχεδίαση raster, φιλικό API, καλά φίλτρα |
|
Μικρότερη εξάρτηση, ή μια υπάρχουσα βάση κώδικα GD |
|
Ευρύτερες μορφές, βαριές ομαδικές μεταμορφώσεις |
|
Και τα τρία είναι raster και μοιράζονται την οροφή του raster: σταθερή ανάλυση, υποβάθμιση κατά τη μεγέθυνση. Όταν χρειάζεστε έξοδο που κλιμακώνεται καθαρά, το επόμενο κεφάλαιο περνά στα διανυσματικά γραφικά με Cairo και SVG.