Swift:PHAsset ImageDataRequest 将 .GIF 更改为 .JPEG
Swift: PHAsset ImageDataRequest changes .GIF to .JPEG
我尝试获取 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)
如果它是 GIF,我使用 uniformTypeIdentifier 检查,如果它是图像或视频,我使用 PHAssetMediaType 检查。
这作为植物工作,但在 requestImageData 之后,GIF 被转换为 JPEG,我只得到一个 JPEG URL。
在照片应用程序中,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"
...
}
提前致谢!
我又看了一遍,在PHImageRequestOptions
中找到了class成员:"version"
这可以设置为"original",所以现在我有这个:
let option = PHImageRequestOptions()
option.isSynchronous = false
option.isNetworkAccessAllowed = true
option.resizeMode = .exact
option.deliveryMode = .highQualityFormat
option.version = .original
这对我有用。
我认为这是因为 Apple 从 iOS 11 开始就将 GIF 转换为图像数组,因此如果我使用原始版本,它会获取 gif 数据。
如有错误请指正,这只是假设!
顺便说一句。它也适用于一些 GIF 以 "unadjusted" 作为版本,但不适用于所有 PHAssets。
我尝试获取 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)
如果它是 GIF,我使用 uniformTypeIdentifier 检查,如果它是图像或视频,我使用 PHAssetMediaType 检查。 这作为植物工作,但在 requestImageData 之后,GIF 被转换为 JPEG,我只得到一个 JPEG URL。
在照片应用程序中,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"
...
}
提前致谢!
我又看了一遍,在PHImageRequestOptions
中找到了class成员:"version"这可以设置为"original",所以现在我有这个:
let option = PHImageRequestOptions()
option.isSynchronous = false
option.isNetworkAccessAllowed = true
option.resizeMode = .exact
option.deliveryMode = .highQualityFormat
option.version = .original
这对我有用。
我认为这是因为 Apple 从 iOS 11 开始就将 GIF 转换为图像数组,因此如果我使用原始版本,它会获取 gif 数据。 如有错误请指正,这只是假设!
顺便说一句。它也适用于一些 GIF 以 "unadjusted" 作为版本,但不适用于所有 PHAssets。