ไฟล์ FLIF คืออะไร??
FLIF (Free Lossless Image Format) เป็นรูปแบบภาพที่ไม่สูญเสียข้อมูลซึ่งใช้นามสกุล .flif สำหรับไฟล์ FLIF อ้างว่ามีประสิทธิภาพดีกว่า PNG, WebP, BPG ที่ไม่สูญเสียข้อมูล และ JPEG 2000 ที่ไม่สูญเสียข้อมูลในแง่ของอัตราการบีบอัด FLIF ใช้การพัวพันแบบโปรเกรสซีฟ เนื่องจากการดาวน์โหลดภาพบางส่วนสามารถใช้เป็นการเข้ารหัสแบบสูญเสียสำหรับภาพทั้งหมด
ประวัติย่อ
FLIF ได้รับการประกาศในเดือนกันยายน 2015 และเวอร์ชันอัลฟ่าเปิดตัวในเดือนตุลาคม 2015 ในเดือนกันยายน 2016 FLIF เวอร์ชันเสถียรเวอร์ชันแรกได้รับการปล่อยตัว
ฟลิฟ ดีไซน์
FLIF ใช้ตัวแปรของ CABAC (การเข้ารหัสเลขคณิตเลขฐานสองแบบปรับตามบริบท), MANIAC (การเข้ารหัสเลขคณิตจำนวนเต็มใกล้ศูนย์แบบ Meta-Adaptive) สำหรับการบีบอัด MANIAC เป็นอัลกอริธึมการเข้ารหัสเอนโทรปีที่พัฒนาโดย Jon Sneyers และ Pieter Wuille ใน MANIAC บริบทคือโหนดของแผนผังการตัดสินใจซึ่งเรียนรู้ในเวลาเข้ารหัสแบบไดนามิก สิ่งนี้ทำให้โมเดลบริบทมีความเฉพาะเจาะจงมากขึ้นและส่งผลให้มีการบีบอัดที่ดีขึ้น FLIF มีคุณสมบัติดังต่อไปนี้:
- รองรับการบีบอัดแบบไม่สูญเสียข้อมูล
- รองรับการบีบอัดแบบสูญเสียด้วยการประมวลผลล่วงหน้าของตัวเข้ารหัส
- รองรับ Greyscale, RGB และ RGBA
- รองรับความลึกของสี 1 ถึง 16 บิตต่อช่องสัญญาณ
- รองรับไฟล์แบบอินเทอร์เลซและไม่อินเทอร์เลซ
- รองรับการถอดรหัสแบบโปรเกรสซีฟของไฟล์ที่ดาวน์โหลดมาบางส่วน
- รองรับภาพเคลื่อนไหว
- รองรับโปรไฟล์สี ICC แบบฝัง, ข้อมูลเมตา Exif และ XMP
- รองรับการบีบอัดไฟล์ raw ของกล้อง (RGGB) อย่างจำกัด
รูปแบบไฟล์ FLIF
ไฟล์ FLIF มีสี่ส่วนต่อไปนี้:
หัวเรื่องหลัก
ส่วนหัวหลักมีข้อมูลเมตาหลัก ได้แก่ ความกว้าง ความสูง ความลึกของสี จำนวนเฟรม
ประเภท | ค่า | รายละเอียด |
---|---|---|
4 ไบต์ | “FLIF” | เวทมนตร์ |
4 บิต | 3 = พรรณี ยังคง; 4 = ฉันยัง; 5 = พรรณี นิม; 6 = i anim | อินเทอร์เลซ, แอนิเมชั่น |
4 บิต | 1 = ระดับสีเทา; 3 = RGB; 4 = RGBA | จำนวนช่องสัญญาณ (nb_channels) |
1 ไบต์ | ‘0’,‘1’,‘2’ (‘0’=กำหนดเอง) | ไบต์ต่อช่อง (Bpc) |
varint | ความกว้าง-1 | ความกว้าง |
varint | ความสูง-1 | ความสูง |
varint | nb_frames-2 (เฉพาะภาพเคลื่อนไหว) | จำนวนเฟรม (nb_frames) |
ชิ้นข้อมูลเมตา
ส่วนนี้ประกอบด้วยข้อมูลที่ไม่ใช่พิกเซล เช่น ข้อมูลเมตาของ Exif/XMP, โปรไฟล์สี ICC และอื่นๆ ที่เข้ารหัสโดยใช้การบีบอัด DEFLATE ชิ้นเหล่านี้ถูกกำหนดคล้ายกับชิ้น PNG โดยมีความแตกต่างตรงที่ขนาดของหัวจับถูกเข้ารหัสด้วยจำนวนตัวแปรของไบต์ ชื่อของก้อนสามารถมีได้ 4 ตัวอักษร (4 ไบต์) หรือค่าต่ำกว่า 32 ซึ่งบ่งชี้ว่าเป็นก้อนที่ไม่บังคับ
ต่อไปนี้เป็นตัวอย่างของหัวจับเสริม:
ชื่อก้อน | คำอธิบาย | เนื้อหา (หลังจาก DEFLATE-คลายการบีบอัด) |
---|---|---|
iCCP | โปรไฟล์สี ICC | ข้อมูลโปรไฟล์สี ICC ดิบ |
eXif | ข้อมูลเมตาของ Exif | ส่วนหัว “Exif\0\0” ตามด้วยส่วนหัว TIFF และข้อมูล EXIF |
eXmp | ข้อมูลเมตา XMP | XMP อยู่ภายใน xpacket แบบอ่านอย่างเดียวโดยไม่มีการเติม |
หลักการตั้งชื่อ
- อักษรตัวแรก: ตัวพิมพ์ใหญ่ใช้สำหรับส่วนที่สำคัญ และตัวพิมพ์เล็กใช้สำหรับชิ้นที่ไม่สำคัญ
- Second Letter: ตัวพิมพ์ใหญ่ใช้สำหรับส่วนรวม และตัวพิมพ์เล็กใช้สำหรับส่วนส่วนตัว
- Third Letter: ตัวพิมพ์ใหญ่ใช้สำหรับจับที่จำเป็นในการแสดงภาพอย่างถูกต้อง และตัวพิมพ์เล็กไม่สำคัญสำหรับการแสดงภาพ
- ตัวอักษรที่สี่: ตัวพิมพ์ใหญ่ใช้สำหรับหัวจับที่สามารถคัดลอกแบบสุ่มสี่สุ่มห้าได้อย่างปลอดภัย หัวจับตัวพิมพ์เล็กขึ้นอยู่กับข้อมูลรูปภาพ
ส่วนหัวที่สอง
ข้อมูลนี้มีข้อมูลเกี่ยวกับการเข้ารหัสจริงของพิกเซล
ประเภท | คำอธิบาย | เงื่อนไข | ค่าเริ่มต้น |
---|---|---|---|
1 ไบต์ | NUL ไบต์ (0x00) ชื่อก้อนของบิตสตรีม FLIF16 | ||
uni_int(1,16) | บิตต่อพิกเซลของช่อง | Bpc == ‘0’: ทำซ้ำ(nb_channels) | 8 ถ้า Bpc == ‘1’, 16 ถ้า 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: ทำซ้ำ(nb_frames) | |
uni_int(0,1) | ค่าสถานะ: has_custom_cutoff_and_alpha | ||
uni_int(1,128) | ทางลัด | has_custom_cutoff_and_alpha | 2 |
uni_int(2,128) | ตัวหารอัลฟา | has_custom_cutoff_and_alpha | 19 |
uni_int(0,1) | ธง: has_custom_bitchance | has_custom_cutoff_and_alpha | 0 |
? | Bitchance | has_custom_bitchance | |
ตัวแปร | การแปลง (ดูด้านล่าง) | ||
uni_int(1) = 0 | ตัวบ่งชี้บิต: เสร็จสิ้นด้วยการแปลง | ||
uni_int(0,2) | ตัวทำนายพิกเซลที่มองไม่เห็น | alpha_zero && interlaced && ช่วงอัลฟ่ารวมศูนย์ |
ช่องทาง
หมายเลขช่อง | รายละเอียด |
---|---|
0 | แดงหรือเทา |
1 | สีเขียว |
2 | สีน้ำเงิน |
3 | อัลฟ่า |
** การแปลง **
ประเภท | คำอธิบาย |
---|---|
uni_int(1) = 1 | บิตตัวบ่งชี้: ยังไม่เสร็จ |
uni_int(0,13) | ตัวระบุการแปลง |
ตัวแปร | ข้อมูลการแปลง (ขึ้นอยู่กับการแปลง) |
การแปลงใช้เพื่อแก้ไขข้อมูลพิกเซลเพื่อการบีบอัดที่ดีขึ้นและเพื่อติดตามค่าพิกเซลที่เกิดขึ้นจริง
ข้อมูลพิกเซล
ส่วนนี้ประกอบด้วยข้อมูลพิกเซลจริงที่เข้ารหัสโดยใช้การเข้ารหัสเอนโทรปีของ MANIAC พิกเซลอาจถูกเข้ารหัสโดยใช้การเข้ารหัสแบบอินเทอร์เลซหรือไม่อินเทอร์เลซ
วิธีอินเทอร์เลซ
ในวิธีนี้ จะมีการกำหนดระดับการซูม ซูมระดับ 0 ใช้สำหรับภาพเต็ม ซูมระดับ 1 ใช้สำหรับแถวที่เป็นเลขคู่ทั้งหมด ซูมระดับ 2 ใช้สำหรับคอลัมน์เลขคู่ทั้งหมดของ zoomlevel 1 กล่าวอีกนัยหนึ่งคือ zoomlevel 2k ที่เป็นเลขคู่ทุกคอลัมน์เป็นเวอร์ชันดาวน์แซมเปิลของ ภาพขนาด 1:2^k ระดับการซูมถูกเข้ารหัสจากสูงสุดไปต่ำสุด
วิธีแบบไม่สอดประสาน
ในวิธีนี้ การเข้ารหัสของแผนผัง MANIAC จะเริ่มต้นทันทีตามด้วยการเข้ารหัสพิกเซล