gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 06:01:37 26 4
gpt4 key购买 nike

此代码类型检查并编译但随后崩溃。如何将 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 推荐的,但它可能是错误的。

最佳答案

问题在于您创建可变数据的方式。 Data 不可转换为 NSMutableData。只需将强制转换从 Data 更改为 CFMutableDataCFDataCreateMutable(nil, 0)。另一种选择是使用 NSMutableData,它是免费桥接到 CFMutableData 的。像这样尝试:

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
}
}

关于swift - 如何在 Swift 中将 CGImage 保存到数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48312161/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com