GD ו־ImageMagick כשאתם זקוקים להם#

Imager הוא ברירת המחדל, אך שתי ספריות רסטר אחרות ראויות להיכרות. GD ותיק יותר, קטן יותר, ובכל מקום: חלק גדול מ־Perl הקיים מצייר איתו, ומודל אינדקס־הצבע שלו ראוי להבנה גם אם לעולם לא תבחרו בו מחדש. ImageMagick, דרך Image::Magick, הוא כבד־המשקל: תמיכת הפורמט הרחבה ביותר ושק ההמרות העמוק ביותר, במחיר תלות גדולה. פרק זה מראה כל אחד, ואומר מתי הוא מנצח את Imager.

GD#

GD עוטף את libgd. הגחמה המגדירה שלו היא אינדקס הצבע: על תמונה קלאסית (פלטה) מקצים כל צבע פעם אחת ואז מציירים עם האינדקס השלם שהוא מחזיר, לא עם הצבע עצמו. זהו שריד מתמונות GIF בנות 256 צבעים, והוא עדיין מופיע ב־API אף שתמונות בצבע אמת הן כעת הנורמה.

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);

הפלט הוא מתודה לכל פורמט המחזירה את הבתים המקודדים, ולכן אתם מדפיסים אותם לידית קובץ בעצמכם:

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 מתאימים יותר.

בחירה#

אתם רוצים …

פנו אל

ציור רסטר חדש, API ידידותי, מסננים טובים

Imager

התלות הקטנה ביותר, או בסיס קוד GD קיים

GD

הפורמטים הרחבים ביותר, המרות אצווה כבדות

Image::Magick

כל השלושה הם רסטר וחולקים את תקרת הרסטר: רזולוציה קבועה, הידרדרות בהגדלה. כשאתם זקוקים לפלט שמשנה קנה־מידה בנקיות, הפרק הבא עובר לגרפיקת ווקטור עם Cairo ו־SVG.