מהו קובץ FLIF?
FLIF (Free Lossless Image Format) הוא פורמט תמונה ללא אובדן המשתמש בסיומת .flif עבור הקבצים שלו. FLIF טוענת שהוא מתעלה על PNG, ללא הפסדים WebP, BPG ללא הפסדים ו-JPEG 2000 ללא הפסדים מבחינת יחס הדחיסה. FLIF משתמש בשזירה פרוגרסיבית, שבגללה כל הורדה חלקית של התמונה יכולה לשמש כקידוד אובדן של התמונה כולה.
היסטוריה קצרה
FLIF הוכרזה בספטמבר 2015, וגרסת האלפא שוחררה באוקטובר 2015. בספטמבר 2016 שוחררה הגרסה היציבה הראשונה של FLIF.
עיצוב FLIF
FLIF משתמש בגרסה של CABAC (קידוד אריתמטי בינארי מותאם להקשר), MANIAC (Meta-Adaptive Near-zero Integer Arithmetic Coding) לצורך דחיסה. MANIAC הוא אלגוריתם קידוד אנטרופיה שפותח על ידי ג’ון סניירס ופיטר ויי. ב-MANIAC, ההקשרים הם צמתים של עצי החלטה הנלמדים בזמן הקידוד באופן דינמי. זה הופך את מודל ההקשר ליותר ספציפי לתמונה ומביא לדחיסה טובה יותר. ל-FLIF יש את התכונות הבאות:
- תומך בדחיסה ללא אובדן
- תומך בדחיסה אובדנית עם עיבוד מקדים של מקודד
- תומך בגווני אפור, RGB ו-RGBA
- תומך בעומק צבע של 1 עד 16 סיביות לכל ערוץ
- תומך בקבצים משולבים ולא משולבים
- תומך בפענוח פרוגרסיבי של קבצים שהורדו חלקית
- תומך באנימציות
- תומך בפרופילי צבע משובצים של ICC, מטא נתונים של Exif ו-XMP
- בעל תמיכה מוגבלת בדחיסת קבצי מצלמה גולמיים (RGGB)
פורמט קובץ FLIF
לקובץ FLIF יש את ארבעת החלקים הבאים:
כותרת ראשית
הכותרת הראשית מכילה את המטא נתונים הראשיים כולל הרוחב, הגובה, עומק הצבע, מספר הפריימים.
סוג | ערך | תיאור |
---|---|---|
4 בתים | “FLIF” | קסם |
4 סיביות | 3 = ni still; 4 = אני עדיין; 5 = ni anim; 6 = i anim | שזירה, אנימציה |
4 סיביות | 1 = גווני אפור; 3 = RGB; 4 = RGBA | מספר ערוצים (nb_channels) |
1 byte | ‘0’,‘1’,‘2’ (‘0’=custom) | בייטים לערוץ (Bpc) |
varint | width-1 | width |
varint | height-1 | גובה |
varint | nb_frames-2 (רק אם אנימציה) | מספר פריימים (nb_frames) |
נתחי מטא נתונים
חלק זה מכיל לא פיקסלים כמו מטא נתונים של Exif/XMP, פרופיל צבע ICC וכו’ המקודד באמצעות דחיסה DEFLATE. נתחים אלו מוגדרים באופן דומה לנתחי PNG כשההבדל הוא שגודל הצ’אק מקודד במספר משתנה של בתים. שמות הנתחים יכולים להיות 4 אותיות (4 בתים) או ערך מתחת ל-32 המציין נתח לא אופציונלי.
להלן דוגמה של צ’אקים אופציונליים:
שם נתח | תיאור | תוכן (לאחר DEFLATE-decompression) |
---|---|---|
iCCP | פרופיל צבע ICC | נתוני פרופיל צבע גולמי של ICC |
eXif | Exif metadata | כותרת “Exif\0\0” ואחריה כותרת TIFF ונתוני EXIF |
eXmp | XMP metadata | XMP הכלול בתוך xpacket לקריאה בלבד ללא ריפוד |
אמנת שמות
- אות ראשונה: אות גדולה משמשת עבור קריטי ואותיות קטנות משמשות עבור נתחים לא קריטיים.
- אות שנייה: אות גדולה משמשת לציבור ואותיות קטנות משמשות לנתחים פרטיים
- אות שלישית: אות גדולה משמשת לצ’אקים הדרושים כדי להציג את התמונה בצורה נכונה ואותיות קטנות לא חשובות להצגת התמונה.
- אות רביעית: אותיות רישיות משמשות לצ’אקים שניתן להעתיק בבטחה בצורה עיוורת. צ’אקים קטנים תלויים בנתוני התמונה.
כותרת שנייה
זה מכיל את המידע לגבי הקידוד בפועל של הפיקסלים.
סוג | תיאור | מצב | ערך ברירת מחדל |
---|---|---|---|
1 byte | NUL byte (0x00), שם נתח של זרם סיביות FLIF16 | ||
uni_int(1,16) | סיביות לכל פיקסל של הערוצים | Bpc == ‘0’: repeat(nb_channels) | 8 if Bpc == ‘1’, 16 if Bpc == ‘2’ |
uni_int(0,1) | סגל: alpha_zero | nb_channels > 3 | 0 |
uni_int(0,100) | מספר לולאות | nb_frames > 1 | |
uni_int(0,60_000) | השהיית פריימים ב-ms | nb_frames > 1: repeat(nb_frames) | |
uni_int(0,1) | דגל: has_custom_cutoff_and_alpha | ||
uni_int(1,128) | cutoff | יש_cutoff_and_alpha_מותאם אישית | 2 |
uni_int(2,128) | מחלק אלפא | יש_חותך_מותאם אישית_ו_אלפא | 19 |
uni_int(0,1) | דגל: has_custom_bitchance | has_custom_cutoff_and_alpha | 0 |
? | Bitchance | יש_כלבה_מותאמת אישית | |
משתנה | טרנספורמציות (ראה להלן) | ||
uni_int(1) = 0 | סיבית אינדיקטור: נעשה עם טרנספורמציות | ||
uni_int(0,2) | מנבא פיקסלים בלתי נראים | אלפא_אפס && משולב && טווח אלפא כולל אפס |
ערוצים
מספר ערוץ | תיאור |
---|---|
0 | אדום או אפור |
1 | ירוק |
2 | כחול |
3 | אלפא |
טרנספורמציות
סוג | תיאור |
---|---|
uni_int(1) = 1 | סיבית אינדיקטור: עדיין לא נעשה |
uni_int(0,13) | מזהה טרנספורמציה |
משתנה | נתוני טרנספורמציה (תלוי בטרנספורמציה) |
טרנספורמציה משמשת לשינוי נתוני פיקסלים לדחיסה טובה יותר וכדי לעקוב אחר ערכי הפיקסלים המתרחשים בפועל.
נתוני פיקסלים
חלק זה מכיל את נתוני הפיקסלים בפועל המקודדים באמצעות קידוד אנטרופיה של MANIAC. הפיקסלים עשויים להיות מקודדים באמצעות קידוד שזור או לא שזור.
שיטה משולבת
בשיטה זו, רמות זום מוגדרות. רמת זום 0 משמשת לתמונה המלאה, רמת זום 1 משמשת עבור כל השורות עם מספר זוגי, רמת זום 2 משמשת עבור כל העמודות הזוגיות של רמת זום 1. במילים אחרות, כל רמת זום זוגית 2k היא גרסה עם דגימה מטה של תמונה, בקנה מידה 1:2^k. רמות הזום מקודדות מהגבוהה לנמוכה ביותר.
שיטה לא משולבת
בשיטה זו, הקידוד של עצי ה-MANIAC מתחיל מיד ולאחריו הקידוד של הפיקסלים.