如何在 Swift 中将 CGImage 保存到数据中?

Posted

技术标签:

【中文标题】如何在 Swift 中将 CGImage 保存到数据中?【英文标题】:How to save CGImage to Data in Swift? 【发布时间】:2018-01-18 00:35:35 【问题描述】:

此代码类型会检查并编译,但随后会崩溃。如何将CGImage 保存到Data 以便稍后再次阅读。

let cgi: CGImage? = ...        
var mData = Data()
let imageDest = CGImageDestinationCreateWithData(mData as! CFMutableData, 
                                                 kUTTypePNG, 1, nil)!
CGImageDestinationAddImage(imageDest, cgi!, nil)
CGImageDestinationFinalize(imageDest)

最后一行崩溃了。控制台中的错误是:

2018-01-17 19:25:43.656664-0500 HelloPencil[2799:3101092] -[_NSZeroData 
  appendBytes:length:]: unrecognized selector sent to instance 0x1c80029c0
2018-01-17 19:25:43.658420-0500 HelloPencil[2799:3101092] *** Terminating app 
  due to uncaught exception 'NSInvalidArgumentException', reason: 
  '-[_NSZeroData appendBytes:length:]: unrecognized selector 
  sent to instance 0x1c80029c0'

DataCFMutableData 的转换是 Xcode 推荐的,但可能是错误的。

【问题讨论】:

【参考方案1】:

问题在于您创建可变数据的方式。只需将强制转换从 Data 更改为 CFMutableDataCFDataCreateMutable(nil, 0)

试试这样:

if let cgi = cgi, 
    let mutableData = CFDataCreateMutable(nil, 0),
    let destination = CGImageDestinationCreateWithData(mutableData, "public.png" as CFString, 1, nil) 
    CGImageDestinationAddImage(destination, cgi, nil)
    if CGImageDestinationFinalize(destination) 
        let data = mutableData as Data
        if let image = UIImage(data: data) 
            print(image.size)
        
     else 
        print("Error writing Image")
    

编辑/更新:Xcode 11 • Swift 5.1

extension CGImage 
    var png: Data? 
        guard let mutableData = CFDataCreateMutable(nil, 0),
            let destination = CGImageDestinationCreateWithData(mutableData, "public.png" as CFString, 1, nil) else  return nil 
        CGImageDestinationAddImage(destination, self, nil)
        guard CGImageDestinationFinalize(destination) else  return nil 
        return mutableData as Data
    

【讨论】:

谢谢,解决了。我可能会报告有关演员阵容的错误。如果从 A 到 B 的转换成功,我认为它不应该在以后死掉,因为 A 并不是真正的 B。

以上是关于如何在 Swift 中将 CGImage 保存到数据中?的主要内容,如果未能解决你的问题,请参考以下文章

让 CGImage 适应 Swift

如何在 Swift 中将绘图保存到 tableview?

如何在 swift 2 中将 UITextField 保存到核心数据?

如何使用Swift选择图像的一部分,裁剪并保存?

生成的 CGImage 总是模糊的

如何在 Swift 中归档和取消归档自定义对象?或者如何在 Swift 中将自定义对象保存到 NSUserDefaults?