我正在尝试从PHLivePhoto上制作一张UIImage的缩略图,这样我就可以在捕捉到照片之前或之后的片刻。我正在与这个错误作斗争:
unexpectedly found nil while unwrapping an Optional value 在…
cgImage = try? imgGenerator.copyCGImageAtTime(CMTimeMake(avAsset.duration.value / 3, avAsset.duration.timescale), actualTime: nil)我对swift2语法非常陌生。请帮我拿一下缩略图。
func makeThubnailsFromLivePhoto(livePhoto: PHLivePhoto) -> UIImageView {
let assetResource = PHAssetResource.assetResourcesForLivePhoto(livePhoto)
let avAsset = AVURLAsset(URL: NSURL(fileURLWithPath: assetResource[1].assetLocalIdentifier))
var err: NSError? = nil
let imgGenerator = AVAssetImageGenerator(asset: avAsset)
var cgImage: CGImage?
var imageView: UIImageView?
cgImage = try? imgGenerator.copyCGImageAtTime(CMTimeMake(avAsset.duration.value / 3, avAsset.duration.timescale), actualTime: nil)
let uiImage = UIImage(CGImage: cgImage!)
imageView = UIImageView(image: uiImage)
imageView!.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width/2, height: self.view.bounds.height/2)
return imageView!
}发布于 2015-10-08 20:42:56
您确定这就是引发错误的那一行吗?我更希望是这一行:
let uiImage = UIImage(CGImage: cgImage!)当创建镜像时出现错误,它就会崩溃。您要么需要在这里使用do/try/catch来捕获错误并处理它们,要么需要使用guard-let来验证cgImage是否为空。每当您使用!时,您都会说:“我敢打赌我的程序肯定不是空的。”
类似地,这一行也没有意义:
var imageView: UIImageView?稍后,您可以从不会失败的构造函数中分配imageView。但它会导致您使用imageView!,这可能是危险的(它碰巧不在这种情况下,但很难知道)。尽可能避免使用!。
通常,您应该避免在x = ...之后使用这种模式的var x: Type?。相反,使用模式let x = ...类型推断是Swift的一个重要部分。
发布于 2015-10-08 21:13:00
正如@RobNapier在他非常好的回答中对您所说的,您的错误不太可能存在于以下行:
cgImage = try? imgGenerator.copyCGImageAtTime(CMTimeMake(avAsset.duration.value / 3, avAsset.duration.timescale), actualTime: nil)根据Apple的说法
您可以使用
try?将错误转换为可选值来处理错误。如果在计算try?表达式时抛出错误,则表达式的值为nil。
您的错误肯定在这一行中:
let uiImage = UIImage(CGImage: cgImage!)您可以使用可选链接修复它,如下所示:
cgImage = try? imgGenerator.copyCGImageAtTime(CMTimeMake(avAsset.duration.value / 3, avAsset.duration.timescale), actualTime: nil)
if let cgImage = cgImage {
let uiImage = UIImage(CGImage: cgImage)
// do the rest of your code here to return the UIImage
}
else {
// was an error and you need to return nil or something else
}或者,您可以按如下方式使用新的guard语句:
cgImage = try? imgGenerator.copyCGImageAtTime(CMTimeMake(avAsset.duration.value / 3, avAsset.duration.timescale), actualTime: nil)
guard let cgImage = cgImage else {
// here you need to return nil or something else you want to know the caller of the function that there was an error
}
let uiImage = UIImage(CGImage: cgImage)
imageView = UIImageView(image: uiImage)
imageView!.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width/2, height: self.view.bounds.height/2)
return imageView!这取决于你使用什么。我希望这对你有帮助。
https://stackoverflow.com/questions/33015834
复制相似问题