Saya mencoba untuk menyimpan UIImage
ke NSData
dan kemudian membaca NSData
kembali ke yang baru UIImage
di Swift. Untuk mengonversi UIImage
menjadi NSData
Saya menggunakan kode berikut:
let imageData: NSData = UIImagePNGRepresentation(myImage)
Bagaimana cara mengonversi imageData
(yaitu NSData
) kembali ke yang baru UIImage
?
let imagePt = UIImage(data: caminhodaImagem)
cukup?Gunakan
imageWithData:
metode, yang diterjemahkan ke Swift sebagaiUIImage(data:)
let image : UIImage = UIImage(data: imageData)
sumber
Sekarang di Swift 4.2 Anda dapat menggunakan
pngData()
metode contoh baruUIImage
untuk mendapatkan data dari gambarlet profileImage = UIImage(named:"profile")! let imageData = profileImage.pngData()
sumber
Detail
Solusi 1
guard let image = UIImage(named: "img") else { return } let jpegData = image.jpegData(compressionQuality: 1.0) let pngData = image.pngData()
Solusi 2.1
extension UIImage { func toData (options: NSDictionary, type: CFString) -> Data? { guard let cgImage = cgImage else { return nil } return autoreleasepool { () -> Data? in let data = NSMutableData() guard let imageDestination = CGImageDestinationCreateWithData(data as CFMutableData, type, 1, nil) else { return nil } CGImageDestinationAddImage(imageDestination, cgImage, options) CGImageDestinationFinalize(imageDestination) return data as Data } } }
Penggunaan solusi 2.1
// about properties: https://developer.apple.com/documentation/imageio/1464962-cgimagedestinationaddimage let options: NSDictionary = [ kCGImagePropertyOrientation: 6, kCGImagePropertyHasAlpha: true, kCGImageDestinationLossyCompressionQuality: 0.5 ] // https://developer.apple.com/documentation/mobilecoreservices/uttype/uti_image_content_types guard let data = image.toData(options: options, type: kUTTypeJPEG) else { return } let size = CGFloat(data.count)/1000.0/1024.0 print("\(size) mb")
Solusi 2.2
extension UIImage { func toJpegData (compressionQuality: CGFloat, hasAlpha: Bool = true, orientation: Int = 6) -> Data? { guard cgImage != nil else { return nil } let options: NSDictionary = [ kCGImagePropertyOrientation: orientation, kCGImagePropertyHasAlpha: hasAlpha, kCGImageDestinationLossyCompressionQuality: compressionQuality ] return toData(options: options, type: .jpeg) } func toData (options: NSDictionary, type: ImageType) -> Data? { guard cgImage != nil else { return nil } return toData(options: options, type: type.value) } // about properties: https://developer.apple.com/documentation/imageio/1464962-cgimagedestinationaddimage func toData (options: NSDictionary, type: CFString) -> Data? { guard let cgImage = cgImage else { return nil } return autoreleasepool { () -> Data? in let data = NSMutableData() guard let imageDestination = CGImageDestinationCreateWithData(data as CFMutableData, type, 1, nil) else { return nil } CGImageDestinationAddImage(imageDestination, cgImage, options) CGImageDestinationFinalize(imageDestination) return data as Data } } // https://developer.apple.com/documentation/mobilecoreservices/uttype/uti_image_content_types enum ImageType { case image // abstract image data case jpeg // JPEG image case jpeg2000 // JPEG-2000 image case tiff // TIFF image case pict // Quickdraw PICT format case gif // GIF image case png // PNG image case quickTimeImage // QuickTime image format (OSType 'qtif') case appleICNS // Apple icon data case bmp // Windows bitmap case ico // Windows icon data case rawImage // base type for raw image data (.raw) case scalableVectorGraphics // SVG image case livePhoto // Live Photo var value: CFString { switch self { case .image: return kUTTypeImage case .jpeg: return kUTTypeJPEG case .jpeg2000: return kUTTypeJPEG2000 case .tiff: return kUTTypeTIFF case .pict: return kUTTypePICT case .gif: return kUTTypeGIF case .png: return kUTTypePNG case .quickTimeImage: return kUTTypeQuickTimeImage case .appleICNS: return kUTTypeAppleICNS case .bmp: return kUTTypeBMP case .ico: return kUTTypeICO case .rawImage: return kUTTypeRawImage case .scalableVectorGraphics: return kUTTypeScalableVectorGraphics case .livePhoto: return kUTTypeLivePhoto } } } }
Penggunaan solusi 2.2
let compressionQuality: CGFloat = 0.4 guard let data = image.toJpegData(compressionQuality: compressionQuality) else { return } printSize(of: data) let options: NSDictionary = [ kCGImagePropertyHasAlpha: true, kCGImageDestinationLossyCompressionQuality: compressionQuality ] guard let data2 = image.toData(options: options, type: .png) else { return } printSize(of: data2)
Representasi gambar akan membutuhkan banyak cpu dan sumber daya memori. Jadi, dalam hal ini lebih baik mengikuti beberapa aturan:
- jangan jalankan jpegData (compressionQuality :) pada antrian utama
- jalankan hanya satu jpegData (compressionQuality :) secara bersamaan
Salah:
for i in 0...50 { DispatchQueue.global(qos: .utility).async { let quality = 0.02 * CGFloat(i) //let data = image.toJpegData(compressionQuality: quality) let data = image.jpegData(compressionQuality: quality) let size = CGFloat(data!.count)/1000.0/1024.0 print("\(i), quality: \(quality), \(size.rounded()) mb") } }
Baik:
let serialQueue = DispatchQueue(label: "queue", qos: .utility, attributes: [], autoreleaseFrequency: .workItem, target: nil) for i in 0...50 { serialQueue.async { let quality = 0.02 * CGFloat(i) //let data = image.toJpegData(compressionQuality: quality) let data = image.jpegData(compressionQuality: quality) let size = CGFloat(data!.count)/1000.0/1024.0 print("\(i), quality: \(quality), \(size.rounded()) mb") } }
Tautan
sumber
Untuk menyimpan sebagai data:
Dari StoryBoard, jika Anda ingin menyimpan data "gambar" pada imageView dari MainStoryBoard, kode berikut akan berfungsi.
let image = UIImagePNGRepresentation(imageView.image!) as NSData?
Untuk memuat "image" ke imageView: Lihat tanda seru "!", "?" apakah itu sama dengan yang satu ini.
imageView.image = UIImage(data: image as! Data)
Jenis "NSData" diubah menjadi jenis "Data" secara otomatis selama proses ini.
sumber
Untuk eksekusi kode yang aman, gunakan
if-let
block withData
untuk mencegah aplikasi crash &, karena fungsiUIImagePNGRepresentation
mengembalikan nilai opsional.if let img = UIImage(named: "TestImage.png") { if let data:Data = UIImagePNGRepresentation(img) { // Handle operations with data here... } }
Operasi gambar umum (seperti png & jpg keduanya):
if let img = UIImage(named: "TestImage.png") { //UIImage(named: "TestImage.jpg") if let data:Data = UIImagePNGRepresentation(img) { handleOperationWithData(data: data) } else if let data:Data = UIImageJPEGRepresentation(img, 1.0) { handleOperationWithData(data: data) } } ******* func handleOperationWithData(data: Data) { // Handle operations with data here... if let image = UIImage(data: data) { // Use image... } }
Dengan menggunakan ekstensi:
extension UIImage { var pngRepresentationData: Data? { return UIImagePNGRepresentation(self) } var jpegRepresentationData: Data? { return UIImageJPEGRepresentation(self, 1.0) } } ******* if let img = UIImage(named: "TestImage.png") { //UIImage(named: "TestImage.jpg") if let data = img.pngRepresentationData { handleOperationWithData(data: data) } else if let data = img.jpegRepresentationData { handleOperationWithData(data: data) } } ******* func handleOperationWithData(data: Data) { // Handle operations with data here... if let image = UIImage(data: data) { // Use image... } }
sumber
Gambar ke Data: -
if let img = UIImage(named: "xxx.png") { let pngdata = img.pngData() } if let img = UIImage(named: "xxx.jpeg") { let jpegdata = img.jpegData(compressionQuality: 1) }
Data ke Gambar: -
let image = UIImage(data: pngData)
sumber
Cepat 5
biarkan gambar yang Anda buat sebagai UIImage menjadi gambar
image.pngData() as NSData?
sumber