ในช่วงสองสามสัปดาห์ที่ผ่านมาฉันทำงานกับรูปภาพในวัตถุประสงค์ -c และสังเกตเห็นพฤติกรรมแปลก ๆ มากมาย อย่างแรกเช่นเดียวกับคนอื่น ๆ อีกมากมายฉันเคยมีปัญหานี้ที่ภาพที่ถ่ายด้วยกล้อง (หรือถ่ายด้วยกล้องของคนอื่นและ MMS จะให้ฉัน) หมุน 90 องศา ฉันไม่แน่ใจว่าทำไมในโลกนี้ถึงเกิดสิ่งนี้ขึ้น (ด้วยเหตุนี้คำถามของฉัน ) แต่ฉันสามารถหางานราคาถูกได้
คำถามของฉันเวลานี้คือทำไมนี้เกิดขึ้น ? ทำไม Apple จึงหมุนภาพ เมื่อฉันถ่ายภาพโดยหันกล้องขึ้นด้านขวาเว้นแต่ฉันจะใช้รหัสที่กล่าวถึงข้างต้นเมื่อฉันบันทึกภาพจะได้รับการบันทึกแบบหมุน ตอนนี้วิธีแก้ปัญหาของฉันก็ใช้ได้จนถึงสองสามวันที่ผ่านมา
แอปพลิเคชันของฉันแก้ไขแต่ละพิกเซลของรูปภาพโดยเฉพาะช่องอัลฟาของ PNG (ดังนั้นการแปลง JPEG ใด ๆ จึงถูกโยนออกไปนอกหน้าต่างสำหรับสถานการณ์ของฉัน) ไม่กี่วันที่ผ่านมาฉันสังเกตเห็นว่าแม้ว่ารูปภาพจะแสดงอย่างถูกต้องในแอพของฉันด้วยรหัสวิธีแก้ปัญหาของฉัน แต่เมื่ออัลกอริทึมของฉันแก้ไขพิกเซลแต่ละพิกเซลของรูปภาพ แต่ก็คิดว่ารูปภาพนั้นหมุน ดังนั้นแทนที่จะแก้ไขพิกเซลที่ด้านบนของภาพมันจะแก้ไขพิกเซลที่ด้านข้างของภาพ (เพราะคิดว่ามันควรจะหมุนได้)! ฉันคิดไม่ออกว่าจะหมุนภาพในหน่วยความจำอย่างไร - โดยหลักการแล้วฉันต้องการเพียงแค่ลบimageOrientation
ธงนั้นทั้งหมดออกด้วยกัน
นี่คือสิ่งอื่นที่ทำให้ฉันงงเช่นกัน ... เมื่อฉันถ่ายภาพimageOrientation
ค่าจะตั้งเป็น 3 รหัสวิธีแก้ปัญหาของฉันฉลาดพอที่จะรู้เรื่องนี้และพลิกมันเพื่อให้ผู้ใช้ไม่สังเกตเห็น นอกจากนี้รหัสของฉันในการบันทึกภาพลงในไลบรารีจะรับรู้สิ่งนี้พลิกมันแล้วบันทึกเพื่อให้ปรากฏในม้วนฟิล์มอย่างถูกต้อง
รหัสนั้นมีลักษณะดังนี้:
NSData* pngdata = UIImagePNGRepresentation (self.workingImage); //PNG wrap
UIImage* img = [self rotateImageAppropriately:[UIImage imageWithData:pngdata]];
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
เมื่อฉันโหลดภาพที่บันทึกใหม่นี้ลงในแอปของฉันค่าimageOrientation
คือ 0 - สิ่งที่ฉันต้องการเห็นและวิธีแก้ปัญหาการหมุนของฉันไม่จำเป็นต้องเรียกใช้ (หมายเหตุ: เมื่อโหลดภาพจากอินเทอร์เน็ตเมื่อเทียบกับภาพที่ถ่ายด้วยกล้องถ่ายรูป , imageOrientation
เป็น 0 เสมอทำให้เกิดพฤติกรรมที่สมบูรณ์แบบ) ด้วยเหตุผลบางประการรหัสบันทึกของฉันดูเหมือนจะลบimageOrientation
ค่าสถานะนี้ ฉันหวังว่าจะขโมยรหัสนั้นและใช้มันเพื่อลบภาพของฉันการวางแนวทันทีที่ผู้ใช้ถ่ายรูปและเพิ่มลงในแอพ แต่ดูเหมือนจะไม่ได้ผล ไม่UIImageWriteToSavedPhotosAlbum
ทำอะไรเป็นพิเศษกับimageOrientation
?
วิธีแก้ไขที่ดีที่สุดสำหรับปัญหานี้คือการหายไปimageOrientation
ทันทีที่ผู้ใช้ถ่ายภาพเสร็จ ฉันคิดว่า Apple มีพฤติกรรมการหมุนด้วยเหตุผลใช่ไหม? มีบางคนแนะนำว่านี่เป็นข้อบกพร่องของ Apple
(... ถ้าคุณยังไม่หลงทาง ... หมายเหตุ 2: เมื่อฉันถ่ายภาพแนวนอนทุกอย่างดูเหมือนจะทำงานได้อย่างสมบูรณ์แบบเช่นเดียวกับภาพที่ถ่ายจากอินเทอร์เน็ต)
แก้ไข:
ภาพและสถานการณ์จริงบางส่วนมีลักษณะดังนี้ จากความคิดเห็นที่ผ่านมาดูเหมือนว่าพฤติกรรมแปลก ๆ นี้จะเป็นมากกว่าพฤติกรรมของ iPhone ซึ่งฉันคิดว่าเป็นสิ่งที่ดี
นี่คือภาพของภาพถ่ายที่ฉันถ่ายด้วยโทรศัพท์ของฉัน (สังเกตทิศทางที่ถูกต้อง) ซึ่งจะปรากฏในโทรศัพท์ของฉันทุกประการเมื่อฉันถ่ายภาพ:
นี่คือลักษณะของภาพใน Gmail หลังจากที่ฉันส่งอีเมลถึงตัวเอง (ดูเหมือนว่า Gmail จะจัดการอย่างถูกต้อง):
นี่คือลักษณะของภาพในรูปขนาดย่อใน windows (ดูเหมือนจะไม่ได้รับการจัดการอย่างถูกต้อง):
และนี่คือลักษณะของภาพจริงเมื่อเปิดด้วย Windows Photo Viewer (ยังจัดการไม่ถูกต้อง):
หลังจากความคิดเห็นทั้งหมดเกี่ยวกับคำถามนี้นี่คือสิ่งที่ฉันคิด ... iPhone ถ่ายภาพแล้วบอกว่า "เพื่อแสดงสิ่งนี้ได้อย่างถูกต้องต้องหมุน 90 องศา" ข้อมูลนี้จะอยู่ในข้อมูล EXIF (ทำไมต้องหมุน 90 องศาแทนที่จะตั้งค่าเป็นแนวตั้งตรงฉันไม่รู้) จากที่นี่ Gmail ฉลาดพอที่จะอ่านและวิเคราะห์ข้อมูล EXIF และแสดงข้อมูลได้อย่างถูกต้อง ของ Windows แต่ไม่ฉลาดพอที่จะอ่านข้อมูล EXIF และดังนั้นจึงแสดงภาพไม่ถูกต้อง สมมติฐานของฉันถูกต้องหรือไม่?