如何从照片库加载动画GIF

时间:2016-06-21 02:36:25

标签: ios swift uiimagepickercontroller gif animated-gif

在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这样的东西?

感谢。

2 个答案:

答案 0 :(得分:8)

是,使用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

答案 1 :(得分:0)

您可以使用 InfoKey .imageURL 访问图像文件的位置并从此 url 检索数据

<?xml version="1.0" encoding="utf-8"?>
<TextView
    android:padding="10dp"
    android:text="Spinner Text"
    android:textColor="?android:textColorHint"
    android:textSize="14sp"
    android:includeFontPadding="false"
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="wrap_content"/>