我在我的相册中有一张gif图像。当我使用UIImagePickerController
选择那张图片时,我需要将其转换为NSData
以进行存储。
之前,我使用了
NSData *thumbData = UIImageJPEGRepresentation(thumbnail, 0.5);
但是它不能用于gif图像。thumbData
将为nil。
我如何从gif图像获取
NSData
?我如何知道这是需要特殊处理的gif图像?
我在我的相册中有一张gif图像。当我使用UIImagePickerController
选择那张图片时,我需要将其转换为NSData
以进行存储。
之前,我使用了
NSData *thumbData = UIImageJPEGRepresentation(thumbnail, 0.5);
但是它不能用于gif图像。thumbData
将为nil。
我如何从gif图像获取NSData
?
我如何知道这是需要特殊处理的gif图像?
关键在于将GIF文件或URL直接下载转换为NSData,而不是将其作为UIImage。绕过UIImage将使GIF文件保持动画。
这是一些将GIF文件转换为NSData的代码:
NSString *filePath = [[NSBundle mainBundle] pathForResource: @"gifFileName" ofType: @"gif"];
NSData *gifData = [NSData dataWithContentsOfFile: filePath];
但说实话,你应该真的考虑不再使用GIF。
动态图不能放在资源文件中。
let path = Bundle.main.path(forResource: "loader", ofType: "gif")!
let data = try! Data(contentsOf: URL(fileURLWithPath: path))
return data
https://github.com/mattt/AnimatedGIFImageSerialization
UIImage *image = ...;
NSData *data = [AnimatedGIFImageSerialization animatedGIFDataWithImage:image
duration:1.0
loopCount:1
error:nil];
import UIKit
import MobileCoreServices
extension UIImage {
func UIImageAnimatedGIFRepresentation(gifDuration: TimeInterval = 0.0, loopCount: Int = 0) throws -> Data {
let images = self.images ?? [self]
let frameCount = images.count
let frameDuration: TimeInterval = gifDuration <= 0.0 ? self.duration / Double(frameCount) : gifDuration / Double(frameCount)
let frameDelayCentiseconds = Int(lrint(frameDuration * 100))
let frameProperties = [
kCGImagePropertyGIFDictionary: [
kCGImagePropertyGIFDelayTime: NSNumber(value: frameDelayCentiseconds)
]
]
guard let mutableData = CFDataCreateMutable(nil, 0),
let destination = CGImageDestinationCreateWithData(mutableData, kUTTypeGIF, frameCount, nil) else {
throw NSError(domain: "AnimatedGIFSerializationErrorDomain",
code: -1,
userInfo: [NSLocalizedDescriptionKey: "Could not create destination with data."])
}
let imageProperties = [
kCGImagePropertyGIFDictionary: [kCGImagePropertyGIFLoopCount: NSNumber(value: loopCount)]
] as CFDictionary
CGImageDestinationSetProperties(destination, imageProperties)
for image in images {
if let cgimage = image.cgImage {
CGImageDestinationAddImage(destination, cgimage, frameProperties as CFDictionary)
}
}
let success = CGImageDestinationFinalize(destination)
if !success {
throw NSError(domain: "AnimatedGIFSerializationErrorDomain",
code: -2,
userInfo: [NSLocalizedDescriptionKey: "Could not finalize image destination"])
}
return mutableData as Data
}
}
UIImagePickerControllerDelegate
函数中的实现。func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
let info = Dictionary(uniqueKeysWithValues: info.map {key, value in (key.rawValue, value)})
if let url = info[UIImagePickerController.InfoKey.referenceURL.rawValue] as? URL, url.pathExtension.lowercased() == "gif" {
picker.dismiss(animated: false, completion: nil)
url.getGifImageDataFromAssetUrl(completion: { imageData in
// Use imageData here.
})
return
}
}
import UIKit
import Photos
extension URL {
func getGifImageDataFromAssetUrl(completion: @escaping(_ imageData: Data?) -> Void) {
let asset = PHAsset.fetchAssets(withALAssetURLs: [self], options: nil)
if let image = asset.firstObject {
PHImageManager.default().requestImageData(for: image, options: nil) { (imageData, _, _, _) in
completion(imageData)
}
}
}
}
将.GIF文件转换为NSData的代码 -
NSString *pathForFile = [[NSBundle mainBundle] pathForResource: @"myGif" ofType: @"gif"];
NSData *dataOfGif = [NSData dataWithContentsOfFile: pathForFile];
NSLog(@"Data: %@", dataOfGif);