ชุมชนโปรแกรมเมอร์ Rust กำลังคึกคักไปด้วยการถกเถียงหลังจากการเปิดตัว image crate เวอร์ชัน 0.25.8 ซึ่งในที่สุดได้เพิ่มการสนับสนุนการจัดการ EXIF orientation การอัปเดตครั้งนี้แก้ไขปัญหาที่มีมานานซึ่งภาพที่ปรับขนาดแล้วจะปรากฏหมุนหรือพลิกไม่ถูกต้อง แต่ได้จุดประกายการถกเถียงที่น่าสนใจเกี่ยวกับแนวทางที่ดีที่สุดในการจัดการการวางแนวของภาพ
Rust Image Crate v0.25.8 ฟังก์ชันใหม่
decoder.orientation()
: อ่านข้อมูล orientation จาก EXIFimg.apply_orientation()
: ใช้การแปลง orientation กับภาพ- ช่วยให้สามารถจัดการ orientation ก่อนการปรับขนาดภาพ
ความท้าทายทางเทคนิคเบื้องหลัง EXIF Orientation
ข้อมูลเมตาดาต้า EXIF orientation บอกโปรแกรมดูภาพว่าควรแสดงภาพถ่ายอย่างไรให้ถูกต้อง เมื่อกล้องตรวจพบว่ากำลังถูกถือในแนวข้างหรือเมื่อกล้องหน้าสร้างภาพกระจกเงา กล้องจะฝังข้อมูลนี้แทนการหมุนข้อมูลพิกเซลจริง ปัญหาเกิดขึ้นเมื่อสร้างภาพขนาดย่อ - ภาพที่ปรับขนาดแล้วจะสูญเสียข้อมูลเมตาดาต้านี้ ทำให้อาจปรากฏคว่ำหรือกระจกเงาเมื่อเปรียบเทียบกับต้นฉบับ
ฟังก์ชันใหม่ของ Rust image crate ช่วยให้นักพัฒนาสามารถอ่านข้อมูลการวางแนวและใช้การแปลงก่อนการปรับขนาด อย่างไรก็ตาม แนวทางนี้ได้สร้างการถกเถียงอย่างมากเกี่ยวกับว่าเป็นวิธีแก้ปัญหาที่เหมาะสมที่สุดหรือไม่
ค่า EXIF Orientation
- ค่า 1: แสดงตามต้นฉบับ (ค่าเริ่มต้น)
- ค่า 2-8: การผสมผสานต่างๆ ของการหมุน 90° และการสะท้อน
- ตรวจสอบโดยใช้เครื่องมือเช่น exiftool:
exiftool -orientation image.jpg
ชุมชนแบ่งออกเป็นสองฝ่ายในเรื่องแนวทางการใช้งาน
ชุมชนโปรแกรมเมอร์ดูเหมือนจะแบ่งออกเป็นสองฝ่ายในเรื่องวิธีที่ดีที่สุดในการจัดการการวางแนว นักพัฒนาบางคนสนับสนุนการใช้การหมุนระหว่างการประมวลผลและลบข้อมูลเมตาดาต้า EXIF ทั้งหมด โดยโต้แย้งว่าวิธีนี้สร้างผลลัพธ์ที่สะอาดและคาดเดาได้มากกว่า คนอื่นๆ ชอบการรักษาข้อมูลพิกเซลต้นฉบับและรักษาข้อมูลเมตาดาต้าการวางแนว โดยเฉพาะสำหรับแอปพลิเคชันที่ต้องการการติดตามการปรับเทียบฮาร์ดแวร์ที่แม่นยำ
เหตุผลหนึ่งที่ดีในการเก็บข้อมูลดิบและการวางแนวแยกกันคือการปรับเทียบฮาร์ดแวร์... มันมีประโยชน์มากในสาขาที่คุณต้องการวิเคราะห์ประสิทธิภาพฮาร์ดแวร์ในระดับพิกเซล (ตอนอย่างเช่นดาราศาสตร์)
การถกเถียงขยายไปถึงการตั้งคำถามว่าทำไมกล้องถึงใช้ EXIF orientation แทนการหมุนภาพระหว่างการถ่าย การพิจารณาด้านต้นทุนดูเหมือนจะเป็นปัจจัยสำคัญ - การเพิ่มความสามารถในการหมุนให้กับฮาร์ดแวร์กล้องเพิ่มค่าใช้จ่ายในการผลิตในอุตสาหกรรมที่ความแตกต่างของราคาเล็กน้อยส่งผลกระทบอย่างมากต่อยอดขาย
ความเป็นไปได้และข้อจำกัดของการหมุนแบบไม่สูญเสียคุณภาพ
การถกเถียงทางเทคนิคที่น่าสนใจได้เกิดขึ้นเกี่ยวกับการหมุน JPEG แบบไม่สูญเสียคุณภาพ แม้ว่าจะเป็นไปได้ในทางทฤษฎีที่จะหมุนภาพ JPEG โดยไม่สูญเสียคุณภาพด้วยการจัดเรียงบล็อกภายในใหม่ แต่วิธีนี้ใช้ได้ดีเฉพาะเมื่อขนาดภาพเป็นจำนวนคูณของ 8 หรือ 16 พิกเซล ภาพในโลกจริงมักไม่ตรงตามข้อกำหนดเหล่านี้ ทำให้เกิดกรณีพิเศษที่ต้องการการประนีประนอมเช่นการตัดหรือการเติม
ข้อจำกัดนี้ช่วยอธิบายว่าทำไมผู้ผลิตกล้องจึงเลือกแนวทางข้อมูลเมตาดาต้า - มันใช้ได้กับทุกกรณีไม่ว่าขนาดภาพจะเป็นอย่างไรและต้องการพลังการประมวลผลน้อยมากระหว่างการถ่าย
ข้อกำหนดการหมุน JPEG แบบไม่สูญเสียข้อมูล
- ใช้งานได้เฉพาะเมื่อขนาดของภาพเป็นจำนวนคูณของ 8 หรือ 16 พิกเซล
- JPEG ใช้บล็อก 8x8 (บล็อก MCU สามารถเป็น 8x8, 8x16, 16x8 หรือ 16x16)
- บล็อกที่ไม่สมบูรณ์ที่ขอบภาพต้องการการเข้ารหัสใหม่ ทำให้การหมุนสูญเสียข้อมูล
มองไปข้างหน้า
การเพิ่มการสนับสนุน EXIF orientation ใน Rust image crate แสดงถึงก้าวสำคัญไปข้างหน้าสำหรับนักพัฒนาที่ทำงานกับการประมวลผลภาพ ในขณะที่ชุมชนยังคงถกเถียงเรื่องแนวทางปฏิบัติที่ดีที่สุด การมีหลายแนวทางให้เลือกช่วยให้นักพัฒนาสามารถเลือกวิธีแก้ปัญหาที่เหมาะสมที่สุดกับกรณีการใช้งานเฉพาะของตน ไม่ว่าจะให้ความสำคัญกับความเรียบง่าย ประสิทธิภาพ หรือการรักษาข้อมูล
อ้างอิง: Resizing images in Rust, now with EXIF orientation support