slimg - CLI สำหรับปรับแต่งภาพที่สร้างด้วย Rust (54GB → 8GB)
(github.com/clroot)ทำไมถึงสร้างมันขึ้นมา?
เดิมทีผมใช้เครื่องมือชื่อ Squoosh ของ Google เป็นประจำ แต่เวอร์ชัน CLI พอรันแล้วเกิดข้อผิดพลาด ส่วนเวอร์ชันเว็บก็พอใช้ได้อยู่... ทว่าเพราะสภาพที่ถูกปล่อยทิ้งตามสไตล์ Google สุดท้ายเลยตัดสินใจทำขึ้นมาเอง ผมลองหาตัวทดแทนแล้ว แต่ก็ไม่เจออะไรที่ถูกใจ
slimg คืออะไร?
มันคือ CLI สำหรับปรับแต่งภาพที่เขียนด้วย Rust รองรับการแปลงระหว่าง JPEG, WebP, PNG, AVIF, QOI รวมถึงการย่อขนาดและการปรับคุณภาพให้เหมาะสม โดยใช้โคเดกสมัยใหม่อย่าง MozJPEG, OxiPNG, ravif
ผลลัพธ์จากการใช้งานจริง:
ผมทำการปรับแต่งรูปภาพส่วนตัวขนาด 54GB แบบเป็นชุด แล้วลดลงเหลือ 8GB (ลดลง 85%) โดยคุณภาพอยู่ในระดับที่แทบมองไม่เห็นความแตกต่างด้วยตาเปล่า
# ประมวลผลทั้งไดเรกทอรีแบบเป็นชุด (ขนาน)
slimg convert ./photos --format webp --quality 85 --recursive
# ย่อขนาด + แปลงไฟล์
slimg resize photo.jpg --width 800 --format avif --quality 70
จุดเด่นทางเทคนิค:
- ประมวลผลแบบขนานทุกคอร์ของ CPU ด้วย Rayon
- ใช้ไฟล์ชั่วคราว → atomic rename เพื่อ overwrite อย่างปลอดภัย
- แยกไลบรารี (
slimg-core) ออกจาก CLI (นำกลับไปใช้ซ้ำได้) - ประสิทธิภาพระดับเนทีฟด้วย C codec bindings
การติดตั้ง:
brew install clroot/tap/slimg
# https://github.com/clroot/slimg/releases
GitHub: https://github.com/clroot/slimg
7 ความคิดเห็น
มีการเพิ่ม Kotlin binding ของ slimg แล้ว ทำให้สามารถประมวลผลรูปภาพบนเซิร์ฟเวอร์/แบ็กเอนด์ได้อย่างง่ายดาย
ผมก็เคยใช้ LLM ทำสิ่งที่ลบพื้นหลังจากไฟล์ที่สร้างเป็น PNG แล้วแปลงเป็น SVG โดยลดขนาดไฟล์ลงพร้อมรักษาคุณภาพไว้เหมือนกันครับ ทำด้วย Rust และส่วนการแปลงเป็น SVG ก็ทำได้ดีมาก แต่ถ้าจะลดขนาดไฟล์ใน SVG ก็หลีกเลี่ยงไม่ได้ที่จะต้องใช้โปรแกรมชื่อ
svgosvgoมีความสามารถยอดเยี่ยมในการตัดโค้ดที่ไม่จำเป็นออกจาก SVG แต่ผมรู้สึกว่าส่วนนี้เป็นเรื่องที่ต้องมีความรู้เฉพาะทางอยู่พอสมควร เลยใช้งานsvgoมาโดยตลอดแต่ผมไม่เคยนึกถึงการใช้โคเด็กรุ่นใหม่อย่าง MozJPEG, OxiPNG, ravif มาก่อนเลยครับ ตอนนี้ก็เลยอยากลองทำดูบ้างแล้ว ขอบคุณสำหรับแรงบันดาลใจครับ
ก่อนหน้านี้ผมใช้ SalOne22/rimage อยู่ น่าจะต้องลองดูว่าอันนี้เป็นอย่างไรบ้าง อย่างน้อยการมี Python binding ให้ก็ดูเป็นข้อดีครับ
มีการเพิ่ม Python binding ของ slimg แล้ว
ผมเองก็ทำเครื่องมือด้วย Rust สำหรับแปลงรูปภาพที่ถูกรวมอยู่ในไฟล์บีบอัดแบบเป็นชุดแล้วใช้อยู่เหมือนกัน คงต้องลองเปลี่ยนการเรียกใช้ภายในมาเป็นรีโพซิทอรีนี้ดูครับ
ไม่ทราบว่าที่การถอดรหัส avif ใช้ได้เฉพาะบน macOS นั้น มีเหตุผลเฉพาะอะไรหรือเปล่าครับ?
ตอนนี้หากคุณใช้เวอร์ชัน 0.1.3 ก็จะสามารถถอดรหัส avif ได้บน Windows และ Linux ด้วย
เป็นเพราะเวอร์ชันของไลบรารีที่ใช้จัดการ
avifในสภาพแวดล้อม GitHub Actions ที่ใช้สำหรับการบิลด์เข้ากันไม่ได้ ทางเรามีแผนจะปรับแก้สภาพแวดล้อมการบิลด์ในเร็ว ๆ นี้ เพื่อให้รองรับavifบนเครื่อง Linux ได้ด้วย