如何从照片库加载动画 GIF
How to load animated GIF from photo library
在 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 之类的东西吗?
谢谢。
是,使用 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
您可以使用 InfoKey .imageURL 访问图像文件的位置,并从此 URL
检索数据
// UIImagePickerControllerDelegate
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
if let path = info[.imageURL] as? URL {
if let data = try? Data(contentsOf: path) {
self.imageView.image = UIImage(data: data)
//Now you have Data of a file: so you can convert it to image or gif or send to server or start animation (e.g. Framework JellyGIF)
self.imageView.startGif(with: .data(data))
}
picker.dismissViewControllerAnimated(true, completion: nil)
}
在 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 之类的东西吗?
谢谢。
是,使用 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
您可以使用 InfoKey .imageURL 访问图像文件的位置,并从此 URL
检索数据// UIImagePickerControllerDelegate
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
if let path = info[.imageURL] as? URL {
if let data = try? Data(contentsOf: path) {
self.imageView.image = UIImage(data: data)
//Now you have Data of a file: so you can convert it to image or gif or send to server or start animation (e.g. Framework JellyGIF)
self.imageView.startGif(with: .data(data))
}
picker.dismissViewControllerAnimated(true, completion: nil)
}