简体   繁体   English

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

[英]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 推荐了从DataCFMutableData ,但可能是错误的。

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更改为CFMutableDataCFDataCreateMutable(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM