我的印象是 UIImage 将支持 iOS 11 中引入的 HEIC/HEIF 文件。但在我的测试中,情况似乎并非如此。如果我确实 let image = UIImage(named: "test") 指向 test.heic 那么 image 为零。如果我使用图像文字,那么它会使应用程序崩溃。想知道这是否暂时还没有实现。谢谢。
3 回答
虽然赵的回答有效,但速度相当慢。下面的速度大约快 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 文件夹中使用图像的方法,因此您要么必须将文件包含在资产之外,要么从网络上提取。如果有人知道解决此问题的方法,请发布。
在 Xcode 10.1 (10B61) 中,UIImage(named: "YourHeifImage")
就像其他资产一样工作。
不过有趣的是,当您想尝试一下……并且您将一张 HEIF 照片从您的(例如 iPhone)照片 AirDrop 到您的 Mac 时,它将获得扩展名.HEIC
(全部大写)。然后,当您将该图像添加到您的 Xcode xcasset 时,Xcode 会抱怨扩展名不正确:
....xcassets:警告:不明确的内容:图像集“IMG_1791”引用了文件“IMG_1791.HEIC”,但该文件没有有效的扩展名。
如果你先把扩展名改成小写.heic
,然后把它加到xcassets中,一切都很好。
您可以通过 CIImage 加载 HEIF,然后转换为 UIImage
CIImage *ciImage = [CIImage imageWithContentsOfURL:url];
imageView.image = [UIImage imageWithCIImage:ciImage];