ฉันสามารถสร้างUIImage
จากการNSData
ใช้[UIImage imageWithData:]
หรือ[UIImage initWithData:]
วิธีการ
ฉันสงสัยว่าฉันจะได้รับNSData
คืนจากที่มีอยู่UIImage
หรือไม่? บางสิ่งบางอย่างในบรรทัดของNSData *myData = [myImage getData];
ฉันสามารถสร้างUIImage
จากการNSData
ใช้[UIImage imageWithData:]
หรือ[UIImage initWithData:]
วิธีการ
ฉันสงสัยว่าฉันจะได้รับNSData
คืนจากที่มีอยู่UIImage
หรือไม่? บางสิ่งบางอย่างในบรรทัดของNSData *myData = [myImage getData];
คำตอบ:
NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality
หรือ
NSData *imageData = UIImagePNGRepresentation(image);
ขึ้นอยู่กับว่าคุณต้องการข้อมูลของคุณในรูปแบบ PNG หรือรูปแบบ JPG
เมื่อเริ่มต้นUIImage
วัตถุด้วยinit(data: originalData)
สิ่งนั้นoriginalData
จะถูกแปลงเป็นข้อมูลดิบในรูปแบบภายในบางประเภท ข้อมูลเหล่านี้สามารถเรียกดูได้ในภายหลังด้วย
let rawData = myImage.cgImage?.dataProvider?.data as Data?
อย่างไรก็ตามเนื่องจากเป็นวัตถุดิบก็เป็นไปได้แม้จะมีขนาดใหญ่กว่าเมื่อใช้rawData
UIImagePNGRepresentation
คุณสามารถคาดหวังได้ว่า UIImage เป็นวัตถุที่จัดรูปแบบเพื่อการแสดงผลดังนั้นจะไม่ใช้ข้อมูลต้นฉบับ (ซึ่งอาจอยู่ในรูปแบบ PNG หรือ JPEG) แต่มีแนวโน้มที่จะเป็นอาร์เรย์พิกเซลหรือรูปแบบภายในอื่น ๆ ในคำอื่น ๆจะไม่เก็บUIImage(data: foo)
foo
หากคุณต้องการใช้ที่อื่นในโปรแกรมของคุณ UIImage ดั้งเดิมจะทำได้ดี (ฉันคิดว่านั่นไม่ใช่กรณีที่นี่)
หากคุณต้องการต่ออนุกรมUIImagePNGRepresentation(...)
จะใช้งานได้ แต่จะมีขนาดใหญ่เกินไปหากต้นฉบับเป็น JPEG UIImageJPEGRepresentation(...)
มักจะส่งผลให้ข้อมูลมีขนาดใหญ่เกินไปเล็กน้อยและสูญเสียเล็กน้อยหากต้นฉบับของคุณคือ PNG ควรเลือกอย่างใดอย่างหนึ่งโดยพิจารณาจากวิธีแสดงภาพและรูปแบบที่คุณคาดว่าจะได้รับ หากคุณกำลังใช้ PNG และต้องการใช้ PNG คุณควรมีขนาดไฟล์ที่ดีและข้อมูลที่เกือบจะเหมือนกันโดยแยกส่วน PNG พิเศษออกไป
หากคุณต้องการรับสำเนาของข้อมูลต้นฉบับที่ถูกต้อง (อาจจะบันทึกไฟล์หลังจากการย่อขนาดย่อหรือเพื่อ SHA1) คุณจะต้องเก็บรักษาข้อมูลนั้นแยกกัน คุณอาจทำสิ่งต่างๆเช่น:
var image:UIImage
var imageData:NSData {
didSet {
image = UIImage(data: imageData)
}
}
เพราะฉันสะดุดกับสิ่งนี้และฉันชอบความรวดเร็ว :)
นี่คือคำแปลที่รวดเร็วของโพสต์ของ Caroiline
var imageData = UIImagePNGRepresentation(image)
หรือ
var imageData = UIImageJPEGRepresentation(image, 0.7)
สวิฟต์ 4.2
let dataPng = image.pngData() // return image as PNG. May return nil if image has no CGImageRef or invalid bitmap format
let dataJpg = image.jpegData(compressionQuality: 1) // return image as JPEG. May return nil if image has no CGImageRef or invalid bitmap format. compression is 0(most)..1(least)
สิ่งที่มีการเปลี่ยนแปลงตั้งแต่คำตอบดังกล่าวข้างต้นได้รับสำหรับผู้ที่ยังคงมองเพราะพวกเขาแบ่งปันความกังวลของ CipherCom: iOS 5 ได้เพิ่มCIImage คุณสมบัติ
CIImage
จะถูกตั้งค่าก็ต่อเมื่อเริ่มต้นด้วยimageWithCIImage:
. นอกจากนี้ยังไม่ใช่ข้อมูลที่ใช้โดยตรง แต่เป็นวัตถุแทนรูปภาพอื่น
UIImageJPEGRepresentation
หรือUIImagePNGRepresentation
จะแก้ไขข้อมูลและทำการแปลงกลับ มีวิธีใดบ้างที่จะบรรลุสิ่งที่ขอ?