HEIC/HEIF 是否支持 UIImage

Is HEIC/HEIF Supported By UIImage

我的印象是 UIImage 会支持 iOS 11 中引入的 HEIC/HEIF 文件。但在我的测试中,情况似乎并非如此。如果我让指向 test.heic 的 image = UIImage(named: "test") 则图像为零。如果我使用图像文字,那么它会使应用程序崩溃。想知道目前是否尚未实施。谢谢

您可以通过CIImage加载HEIF,然后转换为UIImage

CIImage *ciImage = [CIImage imageWithContentsOfURL:url];
imageView.image = [UIImage imageWithCIImage:ciImage];

虽然 Zhao 的回答有效,但速度相当慢。下面的速度大约快 10-20 倍。由于某种原因,它在模拟器中仍然不起作用,但请记住这一点。

func convert(url: URL) -> UIImage? {
    guard let source = CGImageSourceCreateWithURL(url as CFURL, nil) else { return nil }
    guard let cgImage = CGImageSourceCreateImageAtIndex(source, 0, nil) else { return nil }
    return UIImage(cgImage: cgImage)
}

这是 WWDC 幻灯片第 141 页上的概述 session 但我之前不是很清楚:https://devstreaming-cdn.apple.com/videos/wwdc/2017/511tj33587vdhds/511/511_working_with_heif_and_hevc.pdf

不幸的是,我仍然无法找到一种方法来使用 xcassets 文件夹中的图像,因此您要么必须将文件包含在资产之外,要么从网络上提取。如果有人知道解决这个问题的方法,请post。

在 Xcode 10.1 (10B61) 中,UIImage(named: "YourHeifImage") 与其他资产一样工作。


有趣的是,当你想尝试这个时......你从你的(例如iPhone)照片中空投一张HEIF图片到你的mac,它会得到扩展名.HEIC(全部大写)。当您将该图像添加到您的 Xcode xcassets 时,Xcode 抱怨扩展名不正确:

….xcassets: warning: Ambiguous Content: The image set "IMG_1791" references a file "IMG_1791.HEIC", but that file does not have a valid extension.

如果先将扩展名改成小写.heic,然后再添加到xcassets,就没问题了。