【问题标题】:How to save CGImage to Data in Swift?如何在 Swift 中将 CGImage 保存到数据中?
【发布时间】: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 推荐的,但可能是错误的。

【问题讨论】:

    标签: swift swift4 cgimage cfdata


    【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多