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

时间:2016-01-10 15:42:14

标签: ios swift

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

                }

            }


        })
    }


}

2 个答案:

答案 0 :(得分:0)

永远不要尝试制作一组​​图像(例如,你正在做[UIImage])。 UIImage非常大,因此许多图像的数组 巨大并且你的内存耗尽并崩溃。

  • 将图像保存到磁盘,只保留引用(即其名称数组)。

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

答案 1 :(得分:0)

您正在循环的每次迭代中创建一个新的[UIImage],因此在最后一次迭代中只有一个图像,您应该从循环中创建imageArray。话虽如此,你应该考虑@matt回答的内容