Photo Editing Extension เป็นกลไกของ iOS ที่ช่วยให้แอปของบุคคลที่สามสามารถเพิ่มเครื่องมือแก้ไขลงในแอพรูปภาพของระบบได้โดยตรง ซึ่งแตกต่างจากโปรแกรมแก้ไขแบบเต็มรูปแบบ ส่วนขยายจะไม่โหลดรูปภาพไปยังแอปแยกต่างหาก — ผู้ใช้สามารถใช้ฟิลเตอร์ ปรับสี หรือเพิ่มเอฟเฟกต์โดยไม่ต้องออกจากอินเทอร์เฟซมาตรฐาน ตามเอกสารสำหรับนักพัฒนา Apple (2025) PhotoKit มี API มากกว่า 40 รายการสำหรับการทำงานกับทรัพยากรรูปภาพ รวมถึง PHAdjustmentData และ PHContentEditingController
ประเด็นสำคัญ
Photo Editing Extension เป็นประเภทของส่วนขยายแอปใน iOS ที่ฝังเครื่องมือประมวลผลภาพลงในอินเทอร์เฟซมาตรฐานของแอพรูปภาพ ผู้ใช้เปิดรูปภาพ กดปุ่มแก้ไข และเลือกส่วนขยายที่ต้องการจากรายการที่ติดตั้งไว้ หลังจากการแก้ไข ผลลัพธ์จะถูกบันทึกกลับไปยังคลัง และไฟล์ต้นฉบับยังคงพร้อมสำหรับการย้อนกลับ
สถาปัตยกรรมนี้แก้ปัญหาหลักของประสบการณ์ผู้ใช้: ไม่จำเป็นต้องสลับระหว่างแอป ส่งออกและนำเข้าภาพ หรือติดตามเวอร์ชัน ตาม WWDC 2025 ส่วนขยายทั้งหมดทำงานในกระบวนการที่แยกเดี่ยวด้วยแซนด์บ็อกซ์ของตนเองและเวลาดำเนินการที่จำกัด — สูงสุด 30 วินาที ต่อการดำเนินการแก้ไข
ส่วนขยายไม่สามารถเข้าถึงไฟล์ใดๆ ในหน่วยความจำอุปกรณ์ — เฉพาะรูปภาพที่ผู้ใช้ส่งผ่านอินเทอร์เฟซการเลือกอย่างชัดเจนเท่านั้น ซึ่งรับประกันความปลอดภัยของข้อมูลผู้ใช้เมื่อใช้เครื่องมือของบุคคลที่สาม
PhotoKit เป็นเฟรมเวิร์กของ Apple สำหรับทำงานกับคลังสื่อของอุปกรณ์ เปิดตัวใน iOS 8 โดยให้การเข้าถึงทรัพยากรรูปภาพโดยทางโปรแกรม รวมถึงรูปภาพ วิดีโอ อัลบั้ม และข้อมูลเมตา สำหรับส่วนขยายการแก้ไข PhotoKit ทำหน้าที่เป็นชั้นกลางระหว่างพื้นที่จัดเก็บและอินเทอร์เฟซการปรับเปลี่ยน
PHAsset แสดงถึงวัตถุสื่อแต่ละรายการในคลัง — รูปภาพหรือวิดีโอ ผ่าน PHAsset คุณสามารถรับข้อมูลเมตา: วันที่ถ่าย ประเภทไฟล์ ตำแหน่งบนแผนที่ และทิศทางของกล้อง PHAssetResource ให้การเข้าถึงทรัพยากรพื้นฐาน — ตัวอย่างเช่น ไฟล์รูปภาพต้นฉบับในรูปแบบ RAW หรือ HEIC
สำหรับส่วนขยายการแก้ไข PHContentEditingInput มีความสำคัญอย่างยิ่ง — วัตถุที่ประกอบด้วยไฟล์ภาพ (หรือวิดีโอ) ที่สมบูรณ์พร้อมสำหรับการอ่านและประมวลผล ส่วนขยายจะรับวัตถุนี้เมื่อเปิดใช้งานและใช้เป็นวัสดุต้นทาง
PHImageManager จัดการการโหลดและการแคชภาพ สำหรับส่วนขยายการแก้ไข จะไม่ถูกใช้โดยตรง — ส่วนขยายจะรับไฟล์ที่สมบูรณ์ผ่าน PHContentEditingInput อย่างไรก็ตาม PHImageRequestOptions ช่วยให้คุณกำหนดค่าพารามิเตอร์คำขอ: ขนาด ประเภทการส่ง (ซิงโครนัสหรืออะซิงโครนัส) และรูปแบบผลลัพธ์
ตามข้อมูลของ Apple PHImageManager จะแคชภาพขนาดย่อโดยอัตโนมัติใน RAM ซึ่งช่วยเร่งการแสดงตัวอย่างซ้ำๆ สำหรับส่วนขยายการแก้ไข ขอแนะนำให้ใช้ PHImageRequestOptionsDeliveryModeHighQualityFormat เพื่อให้ได้คุณภาพภาพที่ดีที่สุด
let options = PHImageRequestOptions()
options.deliveryMode = .highQualityFormat
options.isSynchronous = true
PHImageManager.default().requestImage(
for: asset,
targetSize: .init(width: 1024, height: 1024),
contentMode: .aspectFill,
options: options
) { image, _ in
// use image for display
}
แต่ละ Photo Editing Extension ใช้โปรโตคอล PHContentEditingController — องค์ประกอบควบคุมกลางของส่วนขยาย โปรโตคอลกำหนดวิธีการสำหรับการแสดงอินเทอร์เฟซ การรับข้อมูลนำเข้า และการบันทึกผลลัพธ์
beginContentEditing(with:) ถูกเรียกเมื่อเซสชันการแก้ไขเริ่มต้น ส่วนขยายจะได้รับ PHContentEditingInput และต้องแสดงอินเทอร์เฟซพร้อมภาพต้นฉบับ finishContentEditing(completionHandler:) เสร็จสิ้นการแก้ไข — ส่วนขยายส่งคืน PHContentEditingOutput พร้อมไฟล์ที่ปรับเปลี่ยนและ AdjustmentData cancelContentEditing() ยกเลิกการเปลี่ยนแปลงโดยไม่บันทึก
รายละเอียดสำคัญ: ในขณะที่เรียก beginContentEditing ส่วนขยายจะเข้าถึงได้เฉพาะรูปภาพเวอร์ชันเดียวเท่านั้น — เวอร์ชันที่ผู้ใช้ร้องขอ ไม่สามารถเข้าถึงรูปภาพหรืออัลบั้มอื่นได้ นี่คือข้อจำกัดของแซนด์บ็อกซ์ที่ Apple กำหนดเพื่อความปลอดภัย
class PhotoEditingViewController: UIViewController {
override func beginContentEditing(
with input: PHContentEditingInput
) {
guard let url = input.fullSizeImageURL else { return }
let image = CIImage(contentsOf: url)
displayImage.image = UIImage(ciImage: image)
}
}
PHContentEditingController แยกอินเทอร์เฟซการแก้ไขออกจากตรรกะการบันทึก กระบวนการหลักของ iOS เรียก beginContentEditing ส่วนขยายแสดง UI ของตน ผู้ใช้ทำการเปลี่ยนแปลง จากนั้น finishContentEditing สร้างไฟล์ใหม่ Apple แนะนำให้ดำเนินการประมวลผลที่ใช้ทรัพยากรมากทั้งหมด — ฟิลเตอร์ CIFilter, การจัดการ Core Image — ในเธรดพื้นหลัง ไม่ใช่เธรดหลัก เพื่อไม่ให้บล็อกอินเทอร์เฟซ
PHAdjustmentData เป็นกลไกสำคัญที่ช่วยให้การแก้ไขแบบไม่ทำลายใน Photo Editing Extension เป็นวัตถุที่เก็บข้อมูลเกี่ยวกับการเปลี่ยนแปลงที่ใช้ในรูปแบบที่กำหนดเอง ส่วนขยายจะซีเรียลไลซ์พารามิเตอร์ฟิลเตอร์ มาสก์ และการตั้งค่าเป็น AdjustmentData และบันทึกพร้อมกับภาพที่ปรับเปลี่ยน
เมื่อเปิดรูปภาพอีกครั้ง ส่วนขยายจะอ่าน AdjustmentData คืนค่าสถานะอินเทอร์เฟซก่อนหน้า และอนุญาตให้ผู้ใช้แก้ไขต่อจากจุดเดิม หากไม่ได้ติดตั้งส่วนขยาย รูปภาพจะแสดงในเวอร์ชันที่บันทึกล่าสุด ในขณะที่ต้นฉบับถูกเก็บแยกต่างหาก
ตามเอกสารของ Apple PHAdjustmentData เก็บ formatIdentifier และ formatVersion — สตริงสำหรับระบุรูปแบบข้อมูล เมื่ออัปเดตส่วนขยาย คุณควรตรวจสอบเวอร์ชันและจัดการรูปแบบเก่าอย่างถูกต้อง
let adjustmentData = PHAdjustmentData(
formatIdentifier: "com.example.photoediting",
formatVersion: "1.0",
data: NSKeyedArchiver.archivedData(
withRootObject: params,
requiringSecureCoding: true
)
)
output.adjustmentData = adjustmentData
ในขณะที่ finishContentEditing ส่วนขยายจะเขียน AdjustmentData ลงในวัตถุ PHContentEditingOutput พร้อมกับไฟล์ภาพที่ปรับเปลี่ยน จากนั้นระบบจะบันทึกทั้งสองส่วนประกอบ: เวอร์ชันสำหรับแสดงและข้อมูลเมตาสำหรับกู้คืนเซสชันการแก้ไข
Photo Editing Extension จะปรากฏในเมนูแอพรูปภาพโดยอัตโนมัติหลังจากติดตั้งแอปที่มีส่วนขยายนั้น ผู้ใช้เปิดรูปภาพ เลือกแก้ไข และในแถวเครื่องมือด้านล่าง ส่วนขยายการแก้ไขที่ติดตั้งทั้งหมด — ทั้งของระบบและของบุคคลที่สาม — จะแสดงขึ้น
ส่วนขยายลงทะเบียนผ่าน Info.plist ของแอปหลักด้วยคีย์ NSExtensionActivationRule ซึ่งระบุว่าประเภทเนื้อหาใดที่จะเปิดใช้งานส่วนขยาย สำหรับโปรแกรมแก้ไขรูปภาพ ActivationRule มักจะต้องการ image — ส่วนขยายจะไม่ปรากฏสำหรับวิดีโอหรือ Live Photos
Apple แนะนำให้ระบุประเภทการเปิดใช้งานที่เฉพาะเจาะจงเพื่อไม่ให้เมนูแก้ไขมากเกินไป หากส่วนขยายรองรับเฉพาะ JPEG และ HEIC ควรจำกัดการเปิดใช้งานเฉพาะรูปแบบเหล่านี้
<!-- Info.plist -->
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.photo-editing</string>
<key>NSExtensionActivationRule</key>
<string>SUBQUERY (extensionItems,
@count <= 1)</string>
</dict>
หลังจากเลือกส่วนขยาย iOS จะสร้างกระบวนการแยกต่างหากด้วย UIViewController ที่กำหนดเองซึ่งแสดงเหนืออินเทอร์เฟซรูปภาพ ผู้ใช้จะเห็นรูปภาพของตน เครื่องมือของส่วนขยาย และปุ่มยกเลิก/เสร็จสิ้น ส่วนขยายไม่สามารถเปลี่ยนการนำทางภายนอกตัวควบคุมของตนเองหรือเข้าถึงส่วนอื่นของระบบได้
ตามแนวทางอินเทอร์เฟซของมนุษย์ของ Apple อินเทอร์เฟซส่วนขยายควรเรียบง่ายและใช้งานได้จริง — ไม่มีโฆษณา ลิงก์ภายนอก หรือองค์ประกอบการนำทางที่ไม่จำเป็น ขอแนะนำให้ใช้ UIScrollView สำหรับแสดงจานสีเครื่องมือเพื่อไม่ให้เกะกะหน้าจอ
คำถามที่พบบ่อย
ส่วนขยายได้รับ PHContentEditingInput พร้อม URL ของไฟล์ภาพที่สมบูรณ์ผ่านเมธอด beginContentEditing(with:) การเข้าถึงจะได้รับเฉพาะรูปภาพที่เลือกเพียงรูปเดียว — ไม่มีสิทธิ์ในทรัพยากรคลังอื่น
ไม่ ต้นฉบับจะไม่ถูกปรับเปลี่ยนเด็ดขาด ส่วนขยายสร้างเวอร์ชันใหม่ผ่าน PHContentEditingOutput และ AdjustmentData เก็บพารามิเตอร์การเปลี่ยนแปลงเพื่อความสามารถในการย้อนกลับไปยังสถานะเดิม
ส่วนขยายทำงานกับทุกรูปแบบที่ PhotoKit รองรับ: JPEG, HEIC, RAW, PNG, TIFF และ Live Photos ข้อจำกัดถูกกำหนดผ่าน NSExtensionActivationRule ใน Info.plist ของส่วนขยาย
iOS จัดสรรสูงสุด 30 วินาที สำหรับการดำเนินการ finishContentEditing หากเกินขีดจำกัด ส่วนขยายจะถูกบังคับให้สิ้นสุดและการเปลี่ยนแปลงจะไม่ถูกบันทึก การประมวลผลพื้นหลังด้วย CIFilter ไม่ขยายเวลานี้
ได้ Core Image (CIFilter) และ Metal (สำหรับเชเดอร์ที่กำหนดเอง) รองรับอย่างเต็มที่ Apple แนะนำให้ย้ายการคำนวณหนักไปยังเธรดพื้นหลังผ่าน Grand Central Dispatch
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม