如何在 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'
从Data
到CFMutableData
的转换是 Xcode 推荐的,但可能是错误的。
【问题讨论】:
【参考方案1】:问题在于您创建可变数据的方式。只需将强制转换从 Data
更改为 CFMutableData
到 CFDataCreateMutable(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 保存到数据中?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 swift 2 中将 UITextField 保存到核心数据?
如何在 Swift 中归档和取消归档自定义对象?或者如何在 Swift 中将自定义对象保存到 NSUserDefaults?