מהו קובץ PNG?
קובץ PNG (גרפיקת רשת ניידת) הוא פורמט קובץ תמונת רסטר המשתמש בדחיסה ללא אובדן. פורמט קובץ זה נוצר כתחליף לפורמט Graphics Interchange (GIF) ואין לו מגבלות זכויות יוצרים. עם זאת, פורמט קובץ PNG אינו תומך בהנפשות. פורמט קובץ PNG תומך בדחיסת תמונה ללא אובדן שהופך אותו לפופולרי בקרב המשתמשים שלו. עם חלוף הזמן, PNG התפתח כאחד הפורמטים הנפוצים של קבצי תמונה.
היסטוריה קצרה של פורמט קובץ PNG
הסיבה העיקרית מאחורי יצירת פורמט קובץ PNG הייתה אלגוריתם הדחיסה המוגן בפטנט, Lempel-Ziv-Welch, המשמש בפורמט קובץ GIF. זה יחד עם מגבלות GIF אחרות יצרו צורך בהחלפת פורמט הקובץ GIF. ההצעה והשם הראשונים לפורמט קובץ PNG הגיעו בינואר 1995. אירועים מרכזיים ביחס לפורמטים של קובץ PNG מפורטים להלן:
- אוקטובר 1996: מפרטי PNG גרסה 1.0 שוחררו והופיעו מאוחר יותר כ-RFC 2083. זה הפך להמלצת W3C באוקטובר 1996.
- דצמבר 1998: גרסה 1.1, עם כמה שינויים קטנים ותוספת של שלושה נתחים חדשים, שוחררה.
- אוגוסט 1999: גרסה 1.2, הוספת נתח נוסף, שוחררה.
- נובמבר 2003: PNG הפך לתקן בינלאומי (ISO/IEC 15948:2003). גרסה זו של PNG שונה רק במעט מגרסה 1.2 ואינה מוסיפה נתחים חדשים.
- מרץ 2004: ISO/IEC 15948:2004
השוואה פונקציונלית של GIF ו-PNG
פורמט קובץ PNG תוכנן להיות פשוט ונייד, בלתי משועבד מבחינה משפטית, ניתן להחלפה, גמיש וחזק. הטבלה הבאה מפרטת את תכונות ה-GIF שעברו בירושה על ידי פורמט קובץ PNG בנוסף לתכונות חדשות.
תכונה | GIF | PNG |
---|---|---|
תמונות בצבע אינדקס של עד 256 צבעים | כן | כן |
תמיכה בסטרימינג | כן | כן |
שקיפות | כן | כן |
מידע נלווה | כן | כן |
עצמאות חומרה ופלטפורמה | כן | כן |
יעיל | כן | כן |
תמונות בצבע אמיתי של עד 48 סיביות לפיקסל | לא | כן |
תמונות בגווני אפור של עד 16 סיביות לפיקסל | לא | כן |
ערוץ אלפא מלא (מסיכות שקיפות כלליות) | לא | כן |
מידע על גמא תמונה | לא | כן |
אמינות | לא | כן |
מצגת ראשונית מהירה יותר | לא | כן |
מבנה קובץ PNG
כמעט לכל מערכות ההפעלה יש תמיכה בפתיחת קבצי PNG. לדוגמה, ל-Microsoft Windows Viewer יש את היכולת לפתוח קבצי PNG מכיוון שלמערכת ההפעלה יש כברירת מחדל את התמיכה הזמינה כחלק מההתקנה. קובץ PNG מורכב מ"חתימה" של PNG ואחריה סדרה של //chunks//.
כותרת קובץ PNG
שמונת הבתים הראשונים של קובץ PNG מכילים תמיד את הערכים הבאים (עשרוניים):
{{{137 80 78 71 13 10 26 10 }}}
חתימה זו מציינת ששאר הקובץ מכיל תמונת PNG בודדת, המורכבת מסדרה של נתחים המתחילים ב-IHDR chunk ומסתיימים ב-IEND chunk.
נתחים
כל נתח מורכב מארבעה חלקים:
אורך: מספר שלם ללא סימן של 4 בתים המעניק את מספר הבתים בשדה הנתונים של הנתח. האורך סופר רק את שדה הנתונים, לא את עצמו, את קוד סוג הנתח או את ה-CRC. אפס הוא אורך חוקי. למרות שמקודדים ומפענחים צריכים להתייחס לאורכו כאל ללא סימן, הערך שלו לא יעלה על 231 בתים.
סוג נתח: קוד מסוג נתח של 4 בתים. לנוחות בתיאור ובבחינת קובצי PNG, קודי סוג מוגבלים לכלול אותיות ASCII רישיות וקטנות (AZ ו-az, או 65-90 ו-97-122 עשרוניים). עם זאת, המקודדים והמפענחים חייבים להתייחס לקודים כערכים בינאריים קבועים, ולא כמחרוזות תווים. לדוגמה, לא יהיה זה נכון לייצג את קוד הסוג IDAT על ידי המקבילות EBCDIC של האותיות הללו. מוסכמות שמות נוספות עבור סוגי נתחים נדונות בסעיף הבא.
נתוני נתח: בתים הנתונים המתאימים לסוג הנתח, אם יש. שדה זה יכול להיות באורך אפס.
CRC: CRC של 4 בתים (בדיקת יתירות מחזורית) המחושבת על הבתים הקודמים בנתח, כולל קוד סוג הנתח ושדות נתוני ה-chunk, אך לא כולל שדה האורך. ה-CRC קיים תמיד, אפילו עבור נתחים שאינם מכילים נתונים.
אורך נתוני נתח יכול להיות כל מספר של בתים עד למקסימום; לכן, המיישמים לא יכולים להניח ש-chunks מיושרים על כל גבולות שגדולים מבייטים.
נתחים יכולים להופיע בכל סדר, בכפוף להגבלות המוטלות על כל סוג נתח. (הגבלה בולטת אחת היא ש-IHDR חייב להופיע ראשון ו-IEND חייב להופיע אחרון; לפיכך נתח IEND משמש כסמן של סוף קובץ.) מספר נתחים מאותו סוג יכולים להופיע, אך רק אם זה מותר ספציפית עבור סוג זה.
סוגי נתחים
סוגי ה-Chunk מסווגים לנתחים קריטיים ו-נלווים על סמך ערך ASCII תלוי-רישיות של 4-בתים שהוקצה ל-Chunk Type. כל ההטמעות חייבות להבין ולעבד בהצלחה את הנתחים הקריטיים הסטנדרטיים. תמונת PNG חוקית חייבת להכיל נתח IHDR, נתח IDAT אחד או יותר וחלק IEND.
דחיסה
שיטת דחיסה PNG 0 (שיטת הדחיסה היחידה המוגדרת כיום עבור PNG) מציינת דחיסה של שחרור/ניפוח עם חלון הזזה של 32768 בתים לכל היותר. Deflate compression היא נגזרת LZ77 המשמשת ב-zip, gzip, pkzip ותוכניות קשורות. נעשה מחקר מקיף שתומך במעמדה ללא פטנטים. הנתונים הדחוסים בתוך זרם הנתונים של zlib מאוחסנים כסדרה של בלוקים, שכל אחד מהם יכול לייצג נתונים גולמיים (לא דחוסים), נתונים דחוסים של LZ77 המקודדים בקודי Huffman קבועים, או נתונים דחוסים של LZ77 המקודדים בקודי Huffman מותאמים אישית. סיבית סמן בבלוק הסופי מזהה אותו כבלוק האחרון, ומאפשרת למפענח לזהות את סוף זרם הנתונים הדחוס.
סינון טרום דחיסה
מסננים מראש דחיסה מוחלים כדי להכין את נתוני התמונה לדחיסה מיטבית. שיטת סינון PNG מגדירה חמישה סוגי מסננים בסיסיים כדלקמן:
סוג מסנן | שם | ערך חזוי |
---|---|---|
0 | ללא | קו הסריקה מועבר ללא שינוי |
1 | Sub | משדר את ההפרש בין כל בייט לבין הערך של הבית המתאים של הפיקסל הקודם. |
2 | Up | המסנן Up() הוא בדיוק כמו המסנן Sub() פרט לכך שהפיקסל מיד מעל הפיקסל הנוכחי, ולא רק משמאלו, משמש כמנבא. |
3 | Average | המסנן Average() משתמש בממוצע של שני הפיקסלים השכנים (משמאל ומעלה) כדי לחזות את הערך של פיקסל. |
4 | Paeth | המסנן Paeth() מחשב פונקציה ליניארית פשוטה של שלושת הפיקסלים השכנים (משמאל, למעלה, שמאל למעלה), ולאחר מכן בוחר כמנבא את הפיקסל השכן הקרוב ביותר לערך המחושב. |
אלגוריתמי סינון מוחלים על ‘בתים’, לא על פיקסלים, ללא קשר לעומק הסיביות או סוג הצבע של התמונה. אלגוריתמי הסינון עובדים על רצף הבתים שנוצר על ידי קו סריקה. אם התמונה כוללת ערוץ אלפא, נתוני האלפא מסוננים באותו אופן כמו נתוני התמונה.
כאשר התמונה משולבת, כל מעבר של תבנית השזירה מטופל כאל תמונה עצמאית למטרות סינון. המסננים פועלים על רצפי הבתים שנוצרו על ידי הפיקסלים המועברים בפועל במהלך מעבר, ו"קו הסריקה הקודם" הוא זה ששודר קודם לכן באותו מעבר, לא זה הסמוך בתמונה השלמה. שימו לב שתת-התמונה המשודרת בכל מעבר היא תמיד מלבנית, אך היא ברוחב ו/או גובה קטנים יותר מהתמונה השלמה. סינון אינו מוחל כאשר תמונת משנה זו ריקה.