Μεταδεδομένα εικόνας και εφαρμοσμένη δημιουργία 2D γραφημάτων#
Δύο πραγματιστικές γωνιές της δουλειάς 2D ολοκληρώνουν τον άξονα των εργαλειοθηκών. Πρώτον, η ανάγνωση των δεδομένων που βρίσκονται ήδη μέσα σε αρχεία εικόνας: διαστάσεις, μορφή, και το μπλοκ EXIF που γράφει μια κάμερα. Δεύτερον, ο πιο συνηθισμένος λόγος για τον οποίο ο κόσμος σχεδιάζει καθόλου, που είναι η μετατροπή αριθμών σε ένα γράφημα. Κανένα από τα δύο δεν είναι εντυπωσιακό, και τα δύο προκύπτουν διαρκώς.
Ανάγνωση μεταδεδομένων: Image::Info#
Πριν σχεδιάσετε πάνω ή αλλάξετε το μέγεθος μιας εικόνας, συχνά χρειάζεται απλώς να ξέρετε γι” αυτήν: πόσο μεγάλη είναι, τι μορφή, τι κατέγραψε η κάμερα. Το Image::Info είναι καθαρή Perl, διαβάζει τις κεφαλίδες χωρίς να αποκωδικοποιεί ολόκληρη την εικόνα, και επιστρέφει μια απλή αναφορά hash.
use Image::Info qw(image_info dim);
my $info = image_info('photo.jpg');
die $info->{error} if $info->{error};
my ($w, $h) = dim($info);
print "format: $info->{file_media_type}\n"; # image/jpeg
print "size: ${w}x${h}\n";
print "created: $info->{DateTime}\n" if $info->{DateTime};
Το dim είναι μια διευκόλυνση που βγάζει το πλάτος και το ύψος από το hash. Τα υπόλοιπα κλειδιά εξαρτώνται από τη μορφή και από το τι κουβαλά το αρχείο: ανάλυση, τύπος χρώματος, και τα κοινά πεδία EXIF για φωτογραφίες. Για ένα γρήγορο «τι είναι αυτό το αρχείο» είναι όλο κι όλο ό,τι χρειάζεστε, και κοστίζει σχεδόν τίποτα γιατί δεν αποκωδικοποιεί ποτέ τα pixel.
Ανάγνωση και εγγραφή μεταδεδομένων: Image::ExifTool#
Όταν χρειάζεστε την πλήρη επιφάνεια μεταδεδομένων, και ειδικά όταν χρειάζεται να τη γράψετε, το Image::ExifTool είναι το οριστικό εργαλείο. Χειρίζεται τα μεταδεδομένα ουσιαστικά κάθε μορφής εικόνας και μέσων, διαβάζει χιλιάδες tags, και μπορεί να τα επεξεργαστεί επιτόπου χωρίς να αγγίξει τα δεδομένα της εικόνας.
use Image::ExifTool qw(:Public);
my $et = Image::ExifTool->new;
$et->ExtractInfo('photo.jpg');
my $model = $et->GetValue('Model'); # camera model
my $when = $et->GetValue('DateTimeOriginal');
print "shot on $model at $when\n" if $model;
# rewrite a tag and save
$et->SetNewValue('Artist' => 'Jane Doe');
$et->WriteInfo('photo.jpg'); # edits metadata only
Το Image::Info απαντά στο «πόσο μεγάλη, τι μορφή» φθηνά· το Image::ExifTool είναι αυτό στο οποίο καταφεύγετε όταν τα ίδια τα μεταδεδομένα είναι η δουλειά (αφαίρεση tags τοποθεσίας για ιδιωτικότητα, ομαδική προσθήκη ετικετών σε μια βιβλιοθήκη φωτογραφιών, ανάγνωση πεδίων σημειώσεων του κατασκευαστή). Και τα δύο αφήνουν τα pixel ήσυχα.
Δημιουργία γραφημάτων: η ειλικρινής κατάσταση της τεχνολογίας#
Η δημιουργία γραφημάτων είναι εφαρμοσμένη σχεδίαση 2D: άξονες, ράβδοι, γραμμές και ετικέτες συντεθειμένες από τα πρωτογενή που ήδη γνωρίζετε. Το τοπίο δημιουργίας γραφημάτων της Perl είναι πιο ισχνό απ” ό,τι ήταν κάποτε. Αρκετά κάποτε δημοφιλή αρθρώματα είναι πλέον ασυντήρητα, οπότε αυτή η ενότητα ξεκινά με αυτά που εξακολουθούν να λειτουργούν και ονομάζει τα υπόλοιπα καθαρά.
GD::Graph για γρήγορα γραφήματα raster#
Το GD::Graph χτίζει πάνω στο GD και εξακολουθεί να συντηρείται. Είναι η συντομότερη διαδρομή προς ένα ραβδόγραμμα, γραμμικό γράφημα ή κυκλικό γράφημα ως PNG. Του δίνετε δεδομένα ως ένα σύνολο παράλληλων πινάκων (ο πρώτος είναι οι ετικέτες x, οι υπόλοιποι είναι σειρές δεδομένων) και το αποδίδει.
use GD::Graph::bars;
my @data = (
['Jan', 'Feb', 'Mar', 'Apr'], # x-axis labels
[ 12, 19, 8, 23 ], # one data series
);
my $chart = GD::Graph::bars->new(400, 300);
$chart->set(
title => 'Widgets shipped',
y_max_value => 25,
dclrs => ['blue'],
) or die $chart->error;
my $gd = $chart->plot(\@data) or die $chart->error;
open my $fh, '>', 'chart.png' or die $!;
binmode $fh;
print $fh $gd->png; # plot() returns a GD::Image
close $fh;
Τα GD::Graph::bars, ::lines, ::pie και ::points είναι τα βαριά όχηματα. Το plot επιστρέφει ένα GD::Image, οπότε ισχύουν όλα από το κεφάλαιο του GD σχετικά με την έξοδο. Αυτή είναι η πραγματιστική προεπιλογή για ένα γράφημα στον δίσκο.
SVG για γραφήματα vector#
Όταν το γράφημα πρέπει να παραμείνει ευκρινές σε οποιοδήποτε μέγεθος, ή να ζει σε μια ιστοσελίδα ως markup, χτίστε το ως SVG απευθείας. Δεν υπάρχει αφαίρεση γραφήματος να μάθετε: υπολογίζετε τα ορθογώνια των ράβδων και τις γραμμές των αξόνων μόνοι σας και τα εκπέμπετε. Αυτό είναι περισσότερος κώδικας από το GD::Graph, αλλά είναι ανεξάρτητο από την ανάλυση και δεν χρειάζεται καμία μεταγλωττισμένη εξάρτηση.
use SVG;
my @values = (12, 19, 8, 23);
my $svg = SVG->new(width => 400, height => 300);
my $base = 260; # baseline y
my $bw = 60; # bar width
for my $i (0 .. $#values) {
my $h = $values[$i] * 8; # scale to pixels
my $x = 40 + $i * ($bw + 20);
$svg->rect(x => $x, y => $base - $h, width => $bw, height => $h,
style => { fill => 'steelblue' });
}
$svg->line(x1 => 30, y1 => $base, x2 => 380, y2 => $base,
style => { stroke => 'black' });
print $svg->xmlify;
Για οτιδήποτε πέρα από ένα απλό ραβδόγραμμα ή γραμμικό γράφημα το χειρόγραφο SVG μεγαλώνει γρήγορα, αλλά ακριβώς για τις κοινές περιπτώσεις είναι καθαρό και χωρίς εξαρτήσεις.
Οι παλαιές επιλογές, ονομασμένες#
Δύο αρθρώματα δημιουργίας γραφημάτων που θα βρείτε να αναφέρονται στο διαδίκτυο είναι ουσιαστικά ασυντήρητα και σημειώνονται εδώ μόνο για να μην αποτελεί έκπληξη η κατάστασή τους. Το Chart::Clicker παράγει ελκυστικά γραφήματα αποδοσμένα με Cairo αλλά δεν έχει δει κυκλοφορία εδώ και χρόνια και κουβαλά ένα μεγάλο δέντρο εξαρτήσεων (συμπεριλαμβανομένου του Moose)· αν το τρέχετε ήδη, λειτουργεί, αλλά δεν είναι επιλογή για νέο κώδικα. Το Chart::Gnuplot οδηγεί ένα εξωτερικό εκτελέσιμο gnuplot και είναι επίσης αδρανές· αν έχετε το gnuplot εγκατεστημένο και θέλετε τη δύναμη σχεδιασμού του, το να το καλέσετε απευθείας (ή μέσω ενός λεπτού δικού σας περιτυλίγματος) είναι πιο συντηρήσιμο από το να εξαρτάστε από το εγκαταλελειμμένο άρθρωμα. Ειδικά για επιστημονικό σχεδιασμό γραφημάτων, τα ίδια τα αρθρώματα γραφικών του οικοσυστήματος PDL είναι η καλύτερα υποστηριζόμενη διαδρομή και ανήκουν στο PDL αντί εδώ.
Πού αφήνει αυτό τον άξονα των εργαλειοθηκών#
Μπορείτε τώρα να δημιουργήσετε, να φορτώσετε, να σχεδιάσετε πάνω, να φιλτράρετε, να αποθηκεύσετε, να διανυσματοποιήσετε, να επιθεωρήσετε και να απεικονίσετε σε γράφημα εικόνες 2D εξ ολοκλήρου στον δίσκο. Το ένα πράγμα που λείπει είναι μια οθόνη: το να φέρετε ένα σχέδιο σε ένα ζωντανό, διαδραστικό παράθυρο. Αυτό είναι το επόμενο κεφάλαιο, και είναι επίσης η γέφυρα προς τα δύο ολοκληρωτικά έργα, που και τα δύο χρειάζονται ένα παράθυρο για να εκτελεστούν.