首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Swift中将UIImage转换成HEIF / HEIC数据?

如何在Swift中将UIImage转换成HEIF / HEIC数据?
EN

Stack Overflow用户
提问于 2020-05-16 00:05:58
回答 1查看 5.4K关注 0票数 8

NSKeyedArchiver是否适合将UIImage转换为Data

代码语言:javascript
运行
复制
do {
    let data = try NSKeyedArchiver.archivedData(withRootObject: UIImage(named: somePath), requiringSecureCoding: true)
    ...
} catch {
    print(error)
}

还是过度使用pngData()更合适?

代码语言:javascript
运行
复制
let image = UIImage(named: somePath)
let data = image?.pngData()

我如何从UIImage转换为HEIF / HEIC Data

目标是将图像保存到设备的文件系统中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-16 01:30:28

不是的。永远不要使用NSKeyedArchiver将图像转换为数据。选择图像格式(HEIC、PNG、JPEG等)并获取其数据表示。只有在保存要在UI中使用的图像时,才应该使用PNG。大多数时候,jpeg是首选的选择。如果该设备支持HEIC,则考虑到图像质量和缩小数据大小,这是一种选择。

如果您需要检查用户设备是否支持HEIC类型,您可以这样做:

代码语言:javascript
运行
复制
var isHeicSupported: Bool {
    (CGImageDestinationCopyTypeIdentifiers() as! [String]).contains("public.heic")
}

如果需要将图像转换为HEIC,则需要从CGImage中获取UIImage,并将UIImageimageOrientation转换为CGImagePropertyOrientation,以便在创建其数据表示时保留方向:

代码语言:javascript
运行
复制
extension UIImage {
    var heic: Data? { heic() }
    func heic(compressionQuality: CGFloat = 1) -> Data? {
        guard
            let mutableData = CFDataCreateMutable(nil, 0),
            let destination = CGImageDestinationCreateWithData(mutableData, "public.heic" as CFString, 1, nil),
            let cgImage = cgImage 
        else { return nil }
        CGImageDestinationAddImage(destination, cgImage, [kCGImageDestinationLossyCompressionQuality: compressionQuality, kCGImagePropertyOrientation: cgImageOrientation.rawValue] as CFDictionary)
        guard CGImageDestinationFinalize(destination) else { return nil }
        return mutableData as Data
    }
}

代码语言:javascript
运行
复制
extension CGImagePropertyOrientation {
    init(_ uiOrientation: UIImage.Orientation) {
        switch uiOrientation {
            case .up: self = .up
            case .upMirrored: self = .upMirrored
            case .down: self = .down
            case .downMirrored: self = .downMirrored
            case .left: self = .left
            case .leftMirrored: self = .leftMirrored
            case .right: self = .right
            case .rightMirrored: self = .rightMirrored
        @unknown default:
            fatalError()
        }
    }
}

代码语言:javascript
运行
复制
extension UIImage {
    var cgImageOrientation: CGImagePropertyOrientation { .init(imageOrientation) }
}

无损压缩的用法:

代码语言:javascript
运行
复制
if isHeicSupported, let heicData = image.heic {
    // write your heic image data to disk
}

或者在图像中添加压缩:

代码语言:javascript
运行
复制
if isHeicSupported, let heicData = image.heic(compressionQuality: 0.75) {
    // write your compressed heic image data to disk
}
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61830224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档