如何检测图像(GIF)是动画还是静止

时间:2018-01-17 09:55:04

标签: ios swift image

我需要检查图像是动画还是普通图像。 iOS中有任何方法可以检查吗?

我认为带有gif扩展名的文件可以是静态图像或动画图像。

如何查看动画或静止图像?

3 个答案:

答案 0 :(得分:1)

以下代码段可能对您有帮助。

基本上,它使用CGImageSourceGetCount来获取gif文件的图像数。然后,它取决于进行图像操作或动画操作的计数。

CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);

size_t count = CGImageSourceGetCount(source);

UIImage *animatedImage;

if (count <= 1) {
    animatedImage = [[UIImage alloc] initWithData:data];
}
else {
    NSMutableArray *images = [NSMutableArray array];

    NSTimeInterval duration = 0.0f;

    for (size_t i = 0; i < count; i++) {
        CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);
   ....
    }
}

来自https://developer.android.com/reference/android/util/Range.html

的代码

答案 1 :(得分:1)

对于仍然来这里寻找Swift答案的任何人。只是要获取图像是否为动画gif,这是我能想到的最简单的方法。 在 Swift 4 上运行良好。对于Swift 4.2,对委托方法进行了几处更改,但没什么大不了的。

仅在IOS 11+上有效,如果需要9/10的支持,请参见下文。

func isAnimatedImage(_ imageUrl: URL) -> Bool {
    if let data = try? Data(contentsOf: imageUrl),
          let source = CGImageSourceCreateWithData(imageData as CFData, nil) {

        let count = CGImageSourceGetCount(source)
        return count > 1
    }
    return false
}

就我而言,我是从UIImagePickerController获取图像

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: Any]) {

    if let imageURL = info[UIImagePickerControllerImageURL] as? URL {
        let isImageAnimated = isAnimatedImage(imageURL)
        print("isAnimated: \(isImageAnimated)")
    }

    picker.dismiss(animated: true, completion: nil)
}

IOS 9和10

对于iOS 9和10,由于它是iOS 11的新功能,因此无法获取UIImagePickerControllerImageURL,因此我们需要使用照片库来获取数据。

导入照片库在顶部

import Photos

添加正确的代码以获取数据

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: Any]) {

    if let imageUrl = info[UIImagePickerControllerReferenceURL] as? URL {

        let asset = PHAsset.fetchAssets(withALAssetURLs: [imageUrl], options: nil)
        if let image = asset.firstObject {
            PHImageManager.default().requestImageData(for: image, options: nil) { (imageData, _, _, _) in
                let isImageAnimated = isAnimatedImage(imageData)
                print("isAnimated: \(isImageAnimated)")
            }
        }


    }

    picker.dismiss(animated: true, completion: nil)

}

func isAnimatedImage(_ imageData: Data) -> Bool {
    if let source = CGImageSourceCreateWithData(imageData as CFData, nil) {
        let count = CGImageSourceGetCount(source)
        return count > 1
    }
    return false
}

答案 2 :(得分:-1)

这确实是可能的,但您可以通过扩展NSData类来创建自己的方法。

以下是获取图片扩展程序的详细信息:Detail

相关问题