[英]How to save CGImage to Data in Swift?
This code type checks and compiles but then crashes.此代码类型检查并编译但随后崩溃。 How do I save a CGImage
to Data
so that I can read it in again later.如何将CGImage
保存到Data
以便我以后可以再次读取它。
let cgi: CGImage? = ...
var mData = Data()
let imageDest = CGImageDestinationCreateWithData(mData as! CFMutableData,
kUTTypePNG, 1, nil)!
CGImageDestinationAddImage(imageDest, cgi!, nil)
CGImageDestinationFinalize(imageDest)
The last line crashes.最后一行崩溃。 Error in console is:控制台中的错误是:
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'
That cast from Data
to CFMutableData
was recommended by Xcode, but maybe it's wrong. Xcode 推荐了从Data
到CFMutableData
,但可能是错误的。
The problem is the way you are creating your mutable data.问题在于您创建可变数据的方式。 Just change your forced casting from Data
to CFMutableData
to CFDataCreateMutable(nil, 0)
只需将强制转换从Data
更改为CFMutableData
到CFDataCreateMutable(nil, 0)
Try like this:像这样尝试:
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")
}
}
edit/update: Xcode 11 • Swift 5.1编辑/更新: 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
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.