Tag Archives: Zopfli

ehoeks-zopfli-png ใช้ Zopfli บีบไฟล์ภาพ png ให้เล็กลง

ไปเจอโปรแกรม ehoeks-zopfli-png ซึ่งจะช่วยบีบย่อไฟล์ png ให้มีขนาดลง ด้วยอัลกอริทึม Zopfli แล้วยังดูภาพแบบ png ได้อยู่ เพราะวิธีคลายการบีบย่อข้อมูลเหมือนเดิม มีแจกโค้ดด้วยครับ ก็มาลองกันเลย พิมพ์คำสั่ง

git clone https://code.google.com/r/ehoeks-zopfli-png/
cd ehoeks-zopfli-png/

ผมใช้ Fedora 18 มีต้องแก้โค้ดนิดหน่อยจึงจะ make ได้ เหมือนจะมีปัญหากับ zlib คือที่ไฟล์ png_optimizer.c ต้องเพิ่มบรรทัด #include “zlib.h” เข้าไปเพราะตอนแรกมันไปหาค่าคงที่ต่างๆ ที่ชื่อขึ้นต้นด้วย Z_ ไม่เจอ และ makefile ก็เพิ่ม -lz เข้าไปในการทำ make: จากนั้นจึง

make

ก็จะได้ไฟล์โปรแกรม zopfli ไว้ใช้งาน ซึ่งสิ่งที่เพิ่มเติมจาก zopfli แบบดั้งเดิม คือเพิ่ม option –png ให้ดึงภาพจากไฟล์ png แล้วบีบใหม่ด้วยอัลกอริทึม Zopfli แล้วบันทึกเป็นไฟล์ภาพ png จากนั้นทดลองบีบภาพเลยครับ ขอใช้รูปของท่านผู้นี้ครับ Nicola Tesla โดยได้ภาพแบบ public domain มาจาก Wikimedia

ภาพต้นฉบับ Tesla3.png ขนาด 162,248 ไบต์

เมื่อสั่ง ./zopfli –png Tesla3.png บีบได้ไฟล์เป็น png ขนาด 131,629 ไบต์ ไม่ได้จับเวลาว่านานขนาดไหนครับแต่รอไม่นาน จะได้ไฟล์ Tesla3.png.png ผมเปลี่ยนชื่อเป็น Tesla3.zopfli.png จะได้ไม่โดนทับในการทดลองต่อไป

เมื่อสั่ง ./zopfli –png –i1000 Tesla3.png เพื่อคำนวณมากขึ้นจะได้บีบไฟล์ให้เล็กลงมากขึ้นไปอีก ก็ได้ขนาดเป็น 131,584 ไบต์ครับ ประหยัดพื้นที่ได้อีกเล็กน้อย โดยใช้เวลาเกือบ 6 นาที

ภาพขณะกำลังทำการทดลองครับ
testing-ehoeks-zopfli-png

ปล. Zopfli มี zopflipng รองรับไฟล์ PNG แล้วครับ

Advertisements

ใช้ Zopfli แบบขนานด้วย Pigz

ต่อจาก Zopfli คราวที่แล้ว มันค่อนข้างจะใช้เวลานานมาก และเมื่อไล่โค้ด deflat.c บรรทัดที่ 688 ดูเหมือนว่ามันเป็น loop ที่ไม่ได้เอาข้อมูลจาก loop รอบที่แล้วมาใช้ จึงน่าจะทำการประมวลผลแบบขนานให้ทำ ZopfliDeflatePart() ของหลายๆ block ไปพร้อมๆ กันได้

แต่ก็ไปอ่านเจอว่า โปรแกรม pigz เวอร์ชันล่าสุด 2.3 ได้ผนวก Zopfli มาให้แล้ว โดย pigz เป็นโปรแกรม gzip แบบที่จะแบ่งงานเป็นส่วนๆ ไปให้ตัวประมวลผลที่มีอยู่หลายคอร์หรือหลายเท็รด ช่วยกันทำงานขนานกัน จะได้เสร็จเร็วๆ เลย yum install ดู พบว่ายังไม่ใช่เวอร์ชัน 2.3 จึงต้องเอา source code มา make เอง ตอนที่ make ต้องใส่ -lm เข้าไปในไฟล์ Makefile ด้วยครับ เพราะมันไม่เห็นฟังก์ชันคณิตศาสตร์ log() เมื่อ make เสร็จก็บีบไฟล์ enwik8 เหมือนเดิม โดยใช้ออฟชัน -11 ให้ pigz ใช้อัลกอริทึมบีบย่อ Zopfli

zopfli-pigz-compressing-enwik8

พบว่า ขนาดไฟล์เล็กกว่า zip แต่ก็ใหญ่กว่า Zopfli แบบที่ลูป -i1000 แต่ก็ใช้เวลาบีบน้อยกว่า ผมไม่แน่ใจว่า pigz มันใช้ Zopfli แบบลูปนานแค่ไหน

แล้วก็มีคนพบว่า Zopfli ยังบีบไม่สุด คือใช้โปรแกรม DeflOpt หรือ Defluff ซึ่งสามารถบีบไฟล์ที่เป็น gzip เพิ่มได้ โดยมันจะคำนวณ huffman code ในไฟล์ใหม่ ให้ได้ไฟล์เล็กสุดๆ มันยังบีบได้อีก เดาว่าเดี๋ยว Zopfli น่าจะมีเวอร์ชั่นใหม่ๆ มาล่ะครับ

อัลกอริทึมใหม่จากกูเกิล Zopfli บีบอัดไฟล์อัตราส่วนดีกว่า 7-zip จริงหรือ

มีข่าวว่า “กูเกิลเปิดตัว Zopfli อัลกอริทึมบีบอัดไฟล์แบบใหม่ที่ให้อัตราส่วนดีกว่า 7-zip” เลยขอพิสูจน์หน่อย อีกทั้งไปเห็นที่ CNX-Soft ได้ทดลองแล้ว ลองกับเขาบ้าง จะใช้ไฟล์ enwik8 ซึ่งมีขนาดร้อยล้านไบต์พอดีเปะจาก http://mattmahoney.net/dc/textdata.html ซึ่งใช้เพื่อ Large Text Compression Benchmark

เลียนแบบวิธีใน CNX-Soft แต่ใช้แค่ -i1000 ครับ บีบแล้วได้ขนาด 34,988,599 ไบต์ ทวีตข้อความผิดไปหน่อย แต่ในรูปที่ capture มานั้นถูกแล้ว

วันต่อมา จึงลองกับ 7-Zip พบว่าสำหรับไฟล์นี้ 7-Zip บีบย่อได้ดีกว่าครับ โดยใช้ option ให้บีบอัดเต็มที่โดยไม่ได้ระบุอัลกอริทึม ซึ่งมันจะใช้แบบ LZMA ก็พบว่าบีบได้เล็กกว่าครับ คือ 24,861,205 ไบต์

enwik8-compare-7z-zip-zopfli

อันที่จริงที่ link ข้างบน Large Text Compression Benchmark ก็มีพูดถึง 7-Zip เหมือนกันครับ ใช้วิธีคล้ายๆ กัน แต่ใส่ option ให้ทำเป็น self-extractor ขนาดก็พอๆ กับที่ผมทดลอง

links แปะอ่าน
https://code.google.com/p/zopfli/source/browse/deflate.c (จุดนี้กำลังไล่ดูอยู่ครับ อัลกอริทึมนี้จะบีบย่อไฟล์ให้ได้ฟอร์แมตที่อัลกอริทึมคลายไฟล์แบบเดิม คลายได้)
http://encode.ru/threads/1689-Google-Compress-Data-More-Densely-with-Zopfli?p=32537&viewfull=1#post32537
https://twitter.com/ohmohm/status/308073421814763522