8

我的印象是 UIImage 将支持 iOS 11 中引入的 HEIC/HEIF 文件。但在我的测试中,情况似乎并非如此。如果我确实 let image = UIImage(named: "test") 指向 test.heic 那么 image 为零。如果我使用图像文字,那么它会使应用程序崩溃。想知道这是否暂时还没有实现。谢谢。

4

3 回答 3

6

虽然赵的回答有效,但速度相当慢。下面的速度大约快 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 页上的概述,但我之前并不太清楚:https ://devstreaming-cdn.apple.com/videos/wwdc/2017/511tj33587vdhds/511/511_working_with_heif_and_hevc.pdf

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

于 2017-10-15T13:59:58.860 回答
5

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


不过有趣的是,当您想尝试一下……并且您将一张 HEIF 照片从您的(例如 iPhone)照片 AirDrop 到您的 Mac 时,它将获得扩展名.HEIC(全部大写)。然后,当您将该图像添加到您的 Xcode xcasset 时,Xcode 会抱怨扩展名不正确:

....xcassets:警告:不明确的内容:图像集“IMG_1791”引用了文件“IMG_1791.HEIC”,但该文件没有有效的扩展名

如果你先把扩展名改成小写.heic,然后把它加到xcassets中,一切都很好。

于 2019-01-31T16:50:02.810 回答
2

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

CIImage *ciImage = [CIImage imageWithContentsOfURL:url];
imageView.image = [UIImage imageWithCIImage:ciImage];
于 2017-10-14T08:14:26.467 回答