Ios 将一系列捕获的图像存储到阵列中

Ios 将一系列捕获的图像存储到阵列中,ios,swift,Ios,Swift,在下面的函数(didPressTakePhoto)中,我尝试拍摄一系列图片(本例中为10张),将它们存储到一个数组中,并将它们作为动画显示在“gif”中。然而,这个程序一直在崩溃,我不知道为什么。这都是在单击一个按钮后完成的,因此函数名为。此外,我还尝试将动画代码置于for循环之外,但imageArray会因为某种原因失去其值 func didPressTakePhoto(){ if let videoConnection = stillImageOutput?.connectionW

在下面的函数(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()

                }

            }


        })
    }


}
func didPressTakePhoto(){
如果let videoConnection=stillImageOutput?.connectionWithMediaType(AVMediaTypeVideo){
videoConnection.videoOrientation=AVCaptureVideoOrientation.Portrait
stillImageOutput?.CaptureSillImageAsynchronousLyfromConnection(视频连接,completionHandler:{
(采样缓冲区,错误)在
//变量计数器=0
如果sampleBuffer!=nil{
对于var指数=0;指数<10;++指数{
让imageData=AVCaptureSillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer)
让dataProvider=CGDataProviderCreateWithCFData(imageData)
让cgImageRef=CGImageCreateWithJPEGDataProvider(dataProvider,nil,true,CGColorRenderingIntent.RenderingIntentDefault)
var imageArray:[UIImage]=[]
让image=UIImage(CGImage:cgImageRef!,比例:1.0,方向:UIImageOrientation.Right)
imageArray.append(图像)
insert(image,atIndex:index++)
self.tempImageView.image=图像
self.tempmageview.hidden=false
//UIImageWriteToSavedPhotosAlbum(图像,无,无,无)
var gif:UIImageView!
gif.animationImages=imageArray
gif.animationRepeatCount=-1
gif.animationDuration=1
gif.startAnimating()
}
}
})
}
}

切勿尝试创建图像数组(即,您正在创建的
[UIImage]
)。UIImage非常大,因此许多映像的数组非常大,您将耗尽内存并崩溃

  • 将图像保存到磁盘,只保留对它们的引用(即它们名称的数组)

  • 在界面中使用图像之前,请将图像缩小到该界面所需的实际物理大小。将全尺寸图像仅用于屏幕大小(或更小)的显示器是一种巨大的能源浪费。您可以使用ImageIO框架从磁盘获取图像的“缩略图”小版本,而不会浪费内存


在循环的每次迭代中都要创建一个新的[UIImage],因此在上一次迭代中只有一个映像,您应该将imageArray创建从循环中移除。话虽如此,你应该考虑到@matt回答的问题

什么是崩溃?哪一行?