Я пытаюсь спасти , UIImage
чтобы NSData
затем прочитать NSData
обратно на новую UIImage
в Swift. Для того, чтобы преобразовать UIImage
в NSData
Я использую следующий код:
let imageData: NSData = UIImagePNGRepresentation(myImage)
Как мне преобразовать imageData
(т.е. NSData
) обратно в новый UIImage
?
let imagePt = UIImage(data: caminhodaImagem)
достаточно?Используйте
imageWithData:
метод, который переводится в Swift какUIImage(data:)
let image : UIImage = UIImage(data: imageData)
источник
Теперь в Swift 4.2 вы можете использовать
pngData()
новый метод экземпляраUIImage
для получения данных из изображения.let profileImage = UIImage(named:"profile")! let imageData = profileImage.pngData()
источник
Детали
Решение 1
guard let image = UIImage(named: "img") else { return } let jpegData = image.jpegData(compressionQuality: 1.0) let pngData = image.pngData()
Решение 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 } } }
Использование решения 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")
Решение 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 } } } }
Использование решения 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)
Представление изображения потребует много ресурсов процессора и памяти. Итак, в этом случае лучше соблюдать несколько правил:
- не запускать jpegData (CompressionQuality :) в основной очереди
- запускать одновременно только один jpegData (сжатие качества :)
Неправильно:
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") } }
Правильно:
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") } }
Ссылки
источник
Чтобы сохранить как данные:
Из StoryBoard, если вы хотите сохранить данные «изображения» в imageView MainStoryBoard, следующие коды будут работать.
let image = UIImagePNGRepresentation(imageView.image!) as NSData?
Чтобы загрузить «изображение» в imageView: посмотрите на восклицательный знак «!», «?» точно ли это то же самое, что и этот.
imageView.image = UIImage(data: image as! Data)
Тип «NSData» автоматически преобразуется в тип «Данные» во время этого процесса.
источник
Для безопасного выполнения кода используйте
if-let
блок с,Data
чтобы предотвратить сбой приложения &, поскольку функцияUIImagePNGRepresentation
возвращает необязательное значение.if let img = UIImage(named: "TestImage.png") { if let data:Data = UIImagePNGRepresentation(img) { // Handle operations with data here... } }
Общие операции с изображениями (например, png и jpg оба):
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... } }
Используя расширение:
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... } }
источник
Изображение в данные: -
if let img = UIImage(named: "xxx.png") { let pngdata = img.pngData() } if let img = UIImage(named: "xxx.jpeg") { let jpegdata = img.jpegData(compressionQuality: 1) }
Данные в изображение: -
let image = UIImage(data: pngData)
источник
Swift 5
пусть изображение, которое вы создаете как UIImage, будет изображением
image.pngData() as NSData?
источник