Swift:PHAsset ImageDataRequest将.GIF更改为.JPEG

时间:2018-03-29 00:46:33

标签: swift animated-gif phasset avasset

我尝试获取PHAssets(视频,图像,动画GIF)的数据。直到今天,处理视频的工作相对较好:

PHImageManager.default().requestAVAsset(forVideo: asset, options: option, resultHandler: self.requestAVVideoAsset)

然后是图像:

PHImageManager.default().requestImage(for: asset, targetSize: imageSize, contentMode: .aspectFill, options: option, resultHandler: self.requestAVImage)

GIF与:

PHImageManager.default().requestImageData(for: asset, options: option, resultHandler: self.requestAVPhotoAsset)

我使用uniformTypeIdentifier检查它是否为GIF,如果是图像或视频则使用PHAssetMediaType。 这作为工厂,但在requestImageData之后,GIF转换为JPEG,我只获得一个JPEG URL。

在Photo应用程序中,GIF正常运行。最初几次GIF按预期工作,但经过几次测试后它停止工作。

这是我的代码:

var isGIF = false
let resources = PHAssetResource.assetResources(for: asset)
for resource in resources {
     if resource.uniformTypeIdentifier == (kUTTypeGIF as String) {
         isGIF = true // THIS WORKS
     }
}

if (asset.mediaType == .video) {
     let option = PHVideoRequestOptions()
     option.isNetworkAccessAllowed = true
     option.deliveryMode = PHVideoRequestOptionsDeliveryMode.highQualityFormat
                PHImageManager.default().requestAVAsset(forVideo: asset, options: option, resultHandler: self.requestAVVideoAsset)
} else {
     let option = PHImageRequestOptions()
     option.isSynchronous = false
     option.isNetworkAccessAllowed = true
     option.resizeMode = .exact
     option.deliveryMode = .highQualityFormat
     let imageSize = CGSize(width: asset.pixelWidth, height: asset.pixelHeight)

     if isGIF {
        // IS CALLED
        PHImageManager.default().requestImageData(for: asset, options: option, resultHandler: self.requestAVPhotoAsset)
     } else {
        PHImageManager.default().requestImage(for: asset, targetSize: imageSize, contentMode: .aspectFill, options: option, resultHandler: self.requestAVImage)
     }
}

然后在requestAVPhotoAsset:

func requestAVPhotoAsset(data: Data?, type: String?, orientation: UIImageOrientation, options: [AnyHashable: Any]?) {


    // THE TYPE IS HERE: "public.jpeg"

   ...
}

提前谢谢!

1 个答案:

答案 0 :(得分:1)

我再看一遍,然后找到了班级成员:"版本"在PHImageRequestOptions

这可以设置为"原创",所以现在我有了这个:

let option = PHImageRequestOptions()
option.isSynchronous = false
option.isNetworkAccessAllowed = true
option.resizeMode = .exact
option.deliveryMode = .highQualityFormat
option.version = .original

这适合我。

我认为这样做的原因是Apple自iOS 11以来将GIF转换为图像数组,因此如果我使用原始版本,它会获取gif数据。 如果我错了,请纠正我,这只是一个假设!

顺便说一句。它也适用于少数GIF,以及"未经调整的"作为版本,但不适用于所有PHAssets。