UIImage是否支持HEIC/HEIF格式?

8

我曾认为UIImage支持iOS 11引入的HEIC/HEIF文件。但在我的测试中,好像并非如此。如果我使用let image = UIImage(named: "test")将其指向test.heic,那么图像为空。如果我使用一个图像文字,则会导致应用程序崩溃。想知道现在是否尚未实现此功能。谢谢。

3个回答

7
在Xcode 10.1 (10B61)中, UIImage(named: "YourHeifImage") 的使用与其他资源一样。有趣的是,如果你想试试这个功能,并且通过AirDrop将一个HEIF图片从你的(iPhone)照片传输到你的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中,就没有问题了。

谢谢@PDK。不知道你有没有进行性能指标测试,看看这比普通的jpg图像慢多少? - Brian F Leighty
有趣。就性能而言,它仍然比jpg图像慢得多。我不记得有多少,但至少比jpg慢一个数量级。他们可能在xcassets下使用了更有效的方法,因为我之前尝试过这种方法,但没有成功。实际上,我刚刚意识到我已经在上面放了一些基准测试(但显然现在已经过时了)。 - Brian F Leighty

7

虽然赵的答案是能够实现的,但是它的速度较慢。以下方法的速度大约快了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文件夹中的图片的方法,因此您必须将文件包含在资产之外或从网络上获取。如果有人知道解决方法,请发帖分享。

我将一个HEIC文件复制到我的文档文件夹中,CGImageSourceCreateWithURL在其URL上失败。 - Lucas van Dongen

3
您可以通过CIImage加载HEIF格式的图片,然后将其转换为UIImage。
CIImage *ciImage = [CIImage imageWithContentsOfURL:url];
imageView.image = [UIImage imageWithCIImage:ciImage];

感谢@zhao yang。提醒大家一下,这在macOS Sierra或High Sierra模拟器上不起作用。我在我的6s上进行了一些测试,想看看在相同像素大小的图像之间加载时间有多长。以下是我的结果:jpeg花费:0.039974667秒 heif花费:0.464739167秒heif花费:0.279650166秒 jpeg花费:0.021772125秒jpeg花费:0.056782417秒 heif花费:0.194127875秒 - Brian F Leighty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接