一尘不染

如何从照片库加载GIF动画

swift

在iOS
Swift中,我很难将动画GIF从设备图片库加载到UIImageView或从中创建.gif文件。如果它是服务器上的文件或正确在应用程序中,则显示动画GIF没问题。但是,当我从照片库中加载它时,会丢失动画。我找到了一些Objective-
C解决方案,并试图将它们转换为Swift,但是没有任何运气。

这是我到目前为止的内容:

@IBAction func buttonTapped(sender: UIButton) {
    selectPhoto()
}

func selectPhoto() {
    let photoLibraryController = UIImagePickerController()
    photoLibraryController.delegate = self
    photoLibraryController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary

    let mediaTypes:[String] = [kUTTypeImage as String]
    photoLibraryController.mediaTypes = mediaTypes
    photoLibraryController.allowsEditing = false

    self.presentViewController(photoLibraryController, animated: true, completion: nil)
}

// UIImagePickerControllerDelegate
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    let origImage = info[UIImagePickerControllerOriginalImage] as! UIImage

    self.imageView.image = origImage

    picker.dismissViewControllerAnimated(true, completion: nil)

}

理想情况下,我想将照片库图像保存到服务器上的gif文件中。从那里,我毫不费力地显示它。但是,我需要一些帮助将照片库中的数据转换为某种类型的属性,而又不会丢失动画。我是否需要使用诸如ALAssetsLibrary之类的东西?

谢谢。


阅读 250

收藏
2020-07-07

共1个答案

一尘不染

是的,使用ALAssetsLibrary→现在称为PHAsset。

您应该获取gif的NSData,而不是UIImage(因为UIImage仅获取第一帧。)

因此,基本上,您将执行以下操作:

一个你得到的资产

let requestOptions = PHImageRequestOptions()
requestOptions.isSynchronous = true // adjust the parameters as you wish

PHImageManager.default().requestImageData(for: asset, options: requestOptions, resultHandler: { (imageData, UTI, _, _) in
    if let uti = UTI,let data = imageData ,
        // you can also use UTI to make sure it's a gif
       UTTypeConformsTo(uti as CFString, kUTTypeGIF) {
        // save data here
    }
})

资源:PHAsset

2020-07-07