在下面的函数中(didPressTakePhoto),我试图拍摄一系列图片(在这种情况下为10),将它们存储到一个数组中并在“gif”中将它们显示为动画。然而程序一直在崩溃,我不明白为什么。这是在单击一次按钮之后,因此是函数名称。另外,我尝试在for循环之外获取动画代码,但是imageArray会因某种原因丢失它的值。
func didPressTakePhoto(){
if let videoConnection = stillImageOutput?.connectionWithMediaType(AVMediaTypeVideo){
videoConnection.videoOrientation = AVCaptureVideoOrientation.Portrait
stillImageOutput?.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler: {
(sampleBuffer, error) in
//var counter = 0
if sampleBuffer != nil {
for var index = 0; index < 10; ++index {
let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer)
let dataProvider = CGDataProviderCreateWithCFData(imageData)
let cgImageRef = CGImageCreateWithJPEGDataProvider(dataProvider, nil, true, CGColorRenderingIntent.RenderingIntentDefault)
var imageArray: [UIImage] = []
let image = UIImage(CGImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.Right)
imageArray.append(image)
imageArray.insert(image, atIndex: index++)
self.tempImageView.image = image
self.tempImageView.hidden = false
//UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
var gif: UIImageView!
gif.animationImages = imageArray
gif.animationRepeatCount = -1
gif.animationDuration = 1
gif.startAnimating()
}
}
})
}
}
答案 0 :(得分:0)
永远不要尝试制作一组图像(例如,你正在做[UIImage]
)。 UIImage非常大,因此许多图像的数组 巨大并且你的内存耗尽并崩溃。
将图像保存到磁盘,只保留引用(即其名称数组)。
在界面中使用图像之前,请将它们缩小到该界面所需的实际物理尺寸。仅使用屏幕尺寸显示器(或更小尺寸)的全尺寸图像是一种巨大的能量浪费。您可以使用ImageIO框架来获取&#34;缩略图&#34;来自磁盘的较小版本的图像而不浪费内存。
答案 1 :(得分:0)
您正在循环的每次迭代中创建一个新的[UIImage],因此在最后一次迭代中只有一个图像,您应该从循环中创建imageArray。话虽如此,你应该考虑@matt回答的内容