将UIImage转换为NSData并在Swift中转换回UIImage?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将UIImage转换为NSData并在Swift中转换回UIImage?相关的知识,希望对你有一定的参考价值。

我正试图将UIImage保存到NSData,然后在swift中将NSData读回新的UIImage。要将UIImage转换为NSData,我使用以下代码:

let imageData: NSData = UIImagePNGRepresentation(myImage)

如何将imageData(即NSData)转换回新的UIImage

答案

UIImage(data:imageData,scale:1.0)假设图像的比例为1。

另一答案

谢谢。帮助了我很多。转换为Swift 3并且工作

保存:let data = UIImagePNGRepresentation(image)

要加载:let image = UIImage(data: data)

另一答案

使用imageWithData:方法,它被转换为Swift为UIImage(data:)

let image : UIImage = UIImage(data: imageData)
另一答案

现在在Swift 4.2中你可以使用pngData() UIImage的新实例方法从图像中获取数据

let profileImage = UIImage(named:"profile")!
let imageData = profileImage.pngData()
另一答案

要另存为数据:

从StoryBoard,如果要在MainStoryBoard的imageView上保存“图像”数据,以下代码将起作用。

let image = UIImagePNGRepresentation(imageView.image!) as NSData?

将“image”加载到imageView:查看感叹号“!”,“?”密切关注这是否与此相同。

imageView.image = UIImage(data: image as! Data)

在此过程中,“NSData”类型会自动转换为“数据”类型。

另一答案

为了安全执行代码,使用带有if-letData块来防止应用程序崩溃,并且函数UIImagePNGRepresentation返回一个可选值。

if let img = UIImage(named: "TestImage.png") {
    if let data:Data = UIImagePNGRepresentation(img) {
       // Handle operations with data here...         
    }
}

注意:数据是Swift 3+类。使用数据代替NSData和Swift 3+

通用图像操作(如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)
另一答案

细节

  • Xcode 10.2.1(10E1001),Swift 5

解决方案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
            }
    

以上是关于将UIImage转换为NSData并在Swift中转换回UIImage?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理 NSData 并返回 UIImage (Swift)

将UIImage转换为NSData并返回UIImage

将 NSData 数组转换为 UIImage 数组

如何将 UIImage 转换为 NSData 或 CFDataRef?

将 UIImage 转换为 NSData 并与核心数据一起保存

将UIImage转换为数据URI