PNG

PNG (ראשי תיבות: Portable Network Graphics, בתרגום לעברית: "גרפיקה ניידת לרשת") הוא פורמט תמונה דיגיטלית המשתמש בדחיסה ללא איבוד נתונים. יוצרי הפורמט קבעו שיש לבטא אותו "פינג", אך בפועל קוראים את ראשי התיבות לאותיותיהן בדרך כלל, קרוב לוודאי כדי למנוע בלבול עם כלי הרשת ping. סיומת קובצי התמונה בפורמט PNG היא png לרוב, ומציין ה-MIME של הפורמט הוא image/png. בשנת 1995 הודיעה חברת יוניסיס על כוונתה לגבות תשלום עבור השימוש באלגוריתם הדחיסה LZW, שבו משתמש, בין היתר, פורמט GIF. צעד זה הוליד את הצורך ליצור תחליף חופשי ממגבלות רישוי עבור GIF, וכך הוחל ביצירת PNG. היוצרים החליטו באותה הזדמנות לחבר פורמט טוב מ-GIF גם מבחינות אחרות, למשל על ידי הסרת המגבלה של 256 צבעים. גרסה 1.0 של מפרט PNG יצאה ב-1 ביולי 1996 והופיעה אחר כך כ-RFC 2083, וב-1 באוקטובר נהייתה לתקן של ה-W3C. גרסה 1.1, עם כמה שינויים קטנים ושלושה גושים נוספים, יצאה ב-31 בדצמבר 1998. גרסה 1.2 הוסיפה גוש אחד. היא יצאה ב-11 באוגוסט 1999. PNG הוא כעת תקן בין-לאומי (ISO/IEC 15948:2003), וגרסת W3C שלו יצאה ב-10 בנובמבר 2003. התקן הזה שונה במעט מאוד מגרסה 1.2 ואין בו גושים חדשים. כל קובץ PNG מתחיל בחתימה באורך 8 בית. ערכיהם של הבתים בהקסדצימלית הם 89 50 4E 47 0D 0A 1A 0A, כל אחד לצורך מטרה מפורשת: 89 - הסיבית העליונה בו 1, וכך יש בו כדי להצביע על פורמט ששומר נתונים ביחידות של 8 ביט ויפחת הסיכוי להתבלבל עם פורמטים אחרים ששומרים נתונים ביחידות אחרות כמו קוד ה-ASCII הישן. 50 4E 47 - האותיות PNG ב-ASCII, לצורך זיהוי בכלי טקסט. 0D 0A - סיום שורה בפורמט של DOS, לצורך זיהוי של המרה מסיום שורה בפורמט של DOS לפורמט של Unix (כלומר שהקובץ הורד במצב טקסט במקום מצב בינארי). 1A - תו שעוצר את תצוגת הקובץ ב-DOS (למשל כשכותבים type image.png בחלון DOS; לא עובד בכל גרסאות DOS). 0A - סיום שורה בפורמט של Unix, לצורך זיהוי של המרה מסיום שורה בפורמט של Unix לפורמט של DOS (כלומר שהקובץ הורד במצב טקסט במקום מצב בינארי). אחרי הפתיח באים חלקים של הקובץ בגושים (chunks). אלה מכילים את התמונה עצמה ומידע עליה, שחלק ממנו הכרחי לתצוגת התמונה וחלק נועד רק לשפר אותה. הראשונים הם הגושים ההכרחיים (critical) והאחרונים גושי העזר (ancillary). החלוקה לגושים נקבעה כדי לאפשר את הרחבת הפורמט בלי לשבור את התאימות לאחור. לפני כל גוש יש ארבעה בתים המציינים את אורך הנתונים אשר בו (כלומר ללא שם הגוש וה-CRC). אחריהם בא שם הגוש, המורכב מארבע אותיות. בשם זה יש הבחנה בין אותיות גדולות לבין קטנות. אם הראשונה גדולה, הגוש הכרחי, ואם קטנה אז הוא גוש עזר. אם השנייה גדולה, הגוש הוא חלק מתקן ציבורי, ואם קטנה אז הוא גוש פרטי. האות הרביעית נוגעת לגושים שהעורך אינו מכיר אותם: אם היא קטנה, מותר לעורך להעתיק אותו בכל מקרה, ואם היא גדולה אז מותר להעתיק אותו רק אם לא שונו הגושים ההכרחיים של הקובץ. אחרי שם הגוש באים הנתונים של הגוש עצמו. אחרי כל גוש בא CRC (סכום בדיקה של סיביות) של שם הגוש והמידע (ללא האורך) באורך 4 בתים, שתפקידו לוודא שלא היו שגיאות בהורדת הקובץ. את הגושים ההכרחיים חייבת כל תוכנת פריסה להכיר כדי לקרוא ולהציג את קובץ ה-PNG: IHDR - הגוש הראשון. זהו פתיח התמונה, והוא מכיל את המידע הבא: אורך התמונה ורוחבה, עומק הסיביות, סוג הצבע, שיטת הדחיסה (רק אחת תקנית), שיטת הסינון ושיטת הסירוג (רק אחת תקנית). PLTE - כולל את מפתח הצבעים (הפלטה, palette), בתמונות שיש להן 256 צבעים או פחות. IDAT - כולל את מפת הסיביות של התמונה עצמה. אפשר שזו תשתרע על פני כמה גושי IDAT. IEND - חותם את הקובץ. גוש זה ריק מכל נתונים. גושי העזר אינם הכרחיים לתצוגה הנכונה של התמונה, אך יש בהם כדי לשפר אותה מאוד. בנוסף יש גושי טקסט להוספת מידע על התמונה בשפת אנוש. tRNS - ערכי שקיפות לצבעים. בתמונות גוני אפור (סוג צבע 0) וצבע RGB (סוג צבע 2) יש בגוש זה ערך אחד המציין צבע אחד בתמונה שהוא שקוף לגמרי. בתמונות עם מפתח צבעים (סוג צבע 3) יכולים להיות ערכים למפתחות רבים, וב-255 דרגות של שקיפות. pHYs - הגודל הפיזי של הפיקסלים. גוש זה מציין את מספר הפיקסלים למטר בתמונה, אופקית ואנכית. למשל ערך של 3780 3780 שווה בקירוב ל-96 פיקסלים לאינץ' (הגודל במערכת חלונות). לחלופין, הוא יכול לציין את היחס בין אורך כל פיקסל לרוחבו. cHRM - פרמטרים לניהול צבעים. גוש זה מסייע לקביעת מרחב הצבעים של התמונה. gAMA - הגאמה של התמונה, כלומר היחס בין הדגימות שבתמונה לבין עוצמת פלט התצוגה (בתוצאה הנראית לעין: בהירות התמונה). iCCP - פרופיל צבע המוטמע בתוך התמונה. זהו עזר יותר מתקדם לניהול צבעים מאשר גוש cHRM. sRGB - גוש המציין שהצבעים שבתמונה הם לפי מרחב הצבעים הנפוץ sRGB. הוא מכיל, בנוסף, בית אחד המציין את ייעוד תצוגת התמונה (תצלום, לוגו, דיאגרמה וכו'). sBIT - מספר הסיביות לערוץ שבתמונה המקורית. למשל גוש sBIT עם ערכים של 6 עבור שלושת צבעי היסוד מציין שהתמונה המקורית קודדה במרחב עוצמת צבעים של 0 עד 63 לכל ערוץ, במקום המרחב 0 עד 255 הרגיל. מכיוון שפורמט PNG תומך רק בערכים של חזקות של 2 למספר הסיביות לערוץ, גוש sBIT מאפשר לשחזר עומקי סיביות לא שגרתיים ללא איבוד נתונים. hIST - היסטוגרמה של התמונה, כלומר רשימה של התדירות שבה מופיע כל צבע. גוש זה נועד לתמונות בעלות מפתח (סוג צבע 3). למערכות תצוגה בעלות מגבלה של צבעים מסייע הגוש לברור את הצבעים החשובים יותר. sPLT - מפתח מומלץ. הגוש הזה נותן אפשרות למפתח צבעים מסוים אם אי אפשר להציג את כל הצבעים. הגוש נועד לכל סוגי התמונות, לא רק לתמונות בעלות מפתח, והוא מכיל גם ערכי שקיפות (אלפא, מ-0 עד 255) ותדירות לצבעים (בכך הוא משלב את התכונות של PLTE,‏ tRNS ו-hIST כולן יחד). bKGD - צבע רקע לתמונה. אם התמונה מכילה פיקסלים שקופים ולא מצוין לה צבע רקע בשום דרך, אז גוש זה יכול לספק את צבע הרקע שבו יוצגו הפיקסלים הללו. tEXt - מידע טקסטואלי לתמונה. מכיל מילת מפתח ולאחריה הטקסט עצמו. הטקסט מוגבל לערכת התווים ISO 8859-1. zTXt - כמו tEXt, אך הטקסט שאחרי מילת המפתח דחוס. אותה ערכת תווים. iTXt - טקסט בין-לאומי. הגוש מכיל את מילת המפתח באנגלית, ואחריה בית המציין אם הטקסט דחוס או לא, ואחריו תגית לשפה (כמו he לעברית; התגית אינה חובה), ואחרי כן מילת המפתח המתורגמת (גם כן אינה חובה) ולבסוף הטקסט בשפה האחרת. מילת המפתח המתורגמת והטקסט מקודדים בקידוד UTF-8 של יוניקוד. tIME - גוש המציין את זמן השינוי האחרון של התמונה (לא של יצירתה הראשונה; לכך משתמשים במילת המפתח Creation Time בגוש tEXt). סוגי הצבע שפורמט PNG מסוגל לאחסן הם אלה: תמונת גוני אפור (סוג צבע 0) תמונת אדום-ירוק-כחול (RGB, או truecolor; סוג צבע 2) תמונות גוני אפור עם ערוץ אלפא (סוג צבע 4) תמונת אדום-ירוק-כחול עם ערוץ אלפא (סוג צבע 6) תמונה עם מפתח צבעים (סוג צבע 3) עומק הסיביות יכול להיות מ-1 (סיבית אחת לפיקסל) עד 64. בתמונות עם מפתח צבעים יכול עומק הסיביות להיות 1 (צבע אחד או שניים; בדרך כלל לתמונות שחור-לבן), 2 (שלושה או ארבעה צבעים; דיאגרמות פשוטות ותמונות CGA),‏ 4 (עד 16 צבעים) או 8 (עד 256 צבעים). בתמונת גוני אפור (סוג צבע 0) יכול עומק הסיביות להיות 1,‏ 2,‏ 4,‏ 8 או 16 (האפשרות הנפוצה ביותר היא 8). בתמונת RGB יכול עומק הסיביות להיות 24‏ (8 סיביות לכל צבע יסוד; זוהי האפשרות הנפוצה ביותר) או 48‏ (16 סיביות לכל צבע יסוד). בתמונות גוני אפור עם ערוץ אלפא (סוג צבע 4) יכול עומק הסיביות להיות 16‏ (8 סיביות לאפור ו-8 סיביות לערוץ האלפא) או 32‏ (16 סיביות לאפור ו-16 סיביות לערוץ האלפא), ובתמונת RGB עם ערוץ אלפא - 32 או 64. התקן קובע שכל המקודדים צריכים לקרוא את כל הצירופים כהלכה, אך בפועל אין זה תמיד המצב, והרבה עורכי תמונות מסוגלים ליצור רק חלק קטן מהצירופים. בתמונה עם מפתח צבעים מאוחסנים הצבעים עצמם בפורמט RGB בעומק 8 סיביות. אסור שיהיו במפתח יותר רשומות מאשר עומק הסיביות מתיר, אך מותר שיהיו פחות (למשל 90 רשומות בתמונה בעלת 90 צבעים, אף שאפשר עד 256). פורמט PNG מאפשר הן שקיפות בינארית, כלומר צבע אחד שקוף לגמרי (כמו ב-GIF), והן שקיפות משתנה (צבעים רבים בדרגות שקיפות שונות), בכל סוגי הצבעים. השקיפות המשתנה, הקרויה גם אלפא, מצוינת בתמונה עם מפתח צבעים באמצעות גוש tRNS, ובתמונות גוני אפור ו-RGB - באמצעות ערוץ נפרד. PNG משתמש בשיטת דחיסה ללא איבוד נתונים בשם DEFLATE, החופשית מפטנטים. בנוסף, לפני דחיסת מפת הסיביות, מקודד ה-PNG מנתח את התמונה כדי להשביח את הדחיסה, באמצעות שיטת סינון המנבאת את ערכי הפיקסלים על פי הקודמים להם. בכך דומה פורמט PNG לפורמט FLAC לדחיסת שמע ללא איבוד נתונים. השימוש בסינון מאפשר דחיסה של פיקסלים דומים גם אנכית ולא רק אופקית. אפשר להשתמש בסירוג (interlacing) כדי לסייע לבעלי קצב הורדה איטי. הסירוג של PNG, באלגוריתם Adam7, מקודד חלקים מהתמונה, ודבר זה מאפשר ראיית תצוגה מקדימה שלה לפני ירידתה בשלמותה. הסירוג של PNG יותר מתוחכם מזה של GIF. השימוש בסירוג מגדיל את הקובץ במקצת, אך התוספת עשויה להשתלם במקרה של תמונות קריטיות (כמו תמונות המשמשות לניווט באתר אינטרנט). יוצרי PNG קבעו שהפורמט לא יכיל הנפשה (שלא כמו GIF). הם החליטו לכלול את ההנפשה בפורמט אחר, דומה ל-PNG, בשם MNG. פורמט זה לא זוכה לשימוש רב. מבין עורכי התמונה יש שהוסיפו תמיכה ב-PNG כלאחר-יד, כביכול, וכאלה שערוכים יותר להתמודד עם תכונות הפורמט. למשל תוכנת הצייר של חלונות XP אינה תומכת כלל בשקיפות, ומייצאת ל-PNG בפורמט RGB של 24 ביטים (סיביות) בלבד. לעומתה, GIMP תומכת בשקיפות ובייצוא של כל עומקי הסיביות פרט לאלה המשתמשים ב-16 סיביות לדגימה (למשל RGB ב-48 סיביות לפיקסל). חלק מעורכי התמונה אינם מיישמים את רמת הדחיסה המיטבית לתמונות PNG, ואין בנמצא שום עורך תמונה שיודע לכתוב את כל סוגי הגושים (כמו iTXt - נכון לשנת 2006, הדרך היחידה לכתוב גוש iTXt היא באמצעות תוכנת שורת הפקודה pngcrush). למרות מטרתה הראשונית של PNG, לספק פורמט תמונה חופשי, עדיין משמש פורמט GIF יותר, מהסיבות הבאות: המחשבה המוטעית ש-PNG מניב קבצים גדולים יותר מ-GIF, משום השוואת קובצי GIF לגרסאות PNG ב-24 סיביות. חוסר התמיכה של אינטרנט אקספלורר 6 בשקיפות משתנה. הבעיה הזו נפתרה בגרסה 7 ומעלה. חוסר התמיכה של PNG בהנפשה. ההנפשה משמשת בפרסומות ובפורומים. חוסר המוטיבציה להחליף פורמט מוכר (השוו להישארותו של MP3 למרות קיומם של Vorbis וכו'). עם זאת בשנים האחרונות ניכרת עליה משמעותית בשימוש בפורמט PNG, בעיקר הודות לתמיכה בשקיפות אשר מאפשרת הפרדה בין הצגת האובייקט (באמצעות קוד HTML) לבין הרקע (באמצעות עיצוב CSS). מגמה זו מורגשת גם בביקוש לתמונות מסוג זה. למשל הופעה של מאגרי תמונות חינמיים המרכזים תמונות בעלות רקע לבן או שקוף. קובץ PNG כמעט תמיד קטן יותר ממקבילו בפורמט GIF (אבל זאת בתנאי שמשווים עומק סיביות זהה בשניהם). GIF מאפשר רק שקיפות בינארית (צבע אחד שקוף לגמרי), ואילו PNG מאפשר שקיפות משתנה (צבעים רבים ובדרגות שקיפות שונות). GIF מוגבל לתמונות עם מפתח, ובעומק צבע עד 8 סיביות, כלומר אינו יכול להכיל יותר מ-256 צבעים. PNG יכול להכיל תמונות ב-24 סיביות (מעבר למספר הגוונים שהעין יכולה להבחין בהם) ואפילו 48 סיביות (לצורך טיפול בתצלומים ללא פוסטריזציה). PNG לא תומך בהנפשה, בשונה מ-GIF. JPEG דוחס תמונות טבעיות הרבה יותר מאשר PNG יכול אף בתאוריה - בדרך כלל לעשירית גודלן ללא תופעות נראות לעין (PNG מגיע בדרך כלל לחצי). JPEG היא דחיסה מאבדת נתונים, על כן אינה מתאימה לארכיבאות או לעיבוד חוזר של התמונה. JPEG היא דחיסה גרועה עבור תמונות עם מעברים חדים, כמו טקסטים וקווים. PNG מצטיין בדחיסת תמונות כאלה, מניב קובץ קטן בהרבה מ-JPEG ואינו מותיר עקבות של הדחיסה על התמונה. JPEG אינו תומך בכל שקיפות שהיא. JPEG מותאם לתמונות לתצלומים. לכן, שימוש בו בתמונה שאינה תצלום (או אינה מזכירה תצלום) תגרום לקובץ באיכות גרועה מאוד עם תופעות רבות הנראות לעין בבירור. כמו כן, ברוב המקרים הלא תצלומיים הקובץ יהיה קטן יותר עם PNG. TIFF תומך בשיטת דחיסה וקידוד רבות. החיסרון, כמובן, הוא שאין ביטחון שתוכנה מסוימת תוכל לקרוא קובץ TIFF מסוים. PNG, לעומת זאת, אינו מותיר למקודדים ברירות רבות, וקובץ PNG שאינו קריא אינו תקני. TIFF יכול להכיל תמונות במודל CMYK, המיועד להדפסה בצבע. PNG מוגבל למודל RGB. TIFF יכול להכיל כמה תמונות בתוך קובץ אחד. זו אינה הנפשה כמו ב-GIF, אלא דומה יותר לשקפים של מצגת. PNG מוגבל לתמונה יחידה בקובץ. לדחיסת טקסט שחור-לבן, אלגוריתם CCITT G4 של TIFF יותר טוב מאשר הדחיסה של PNG, וזה, יחד עם האפשרות להכיל מספר תמונות בקובץ אחד, הופך את TIFF ליותר מתאים לאחסון סריקות של דפים. אתר האינטרנט הרשמי של PNG (באנגלית) אתר האינטרנט הרשמי של PNG (באנגלית) המפרט של PNG - הגרסה השנייה באתר W3C (באנגלית)