8

我已经.heic在我的项目中的文件夹中设置了图像xcassets以节省一些空间。但是我无法通过UIImage(named:)构造函数加载它们。我总是得到nil,所以我必须加载它们的唯一方法是指定 URL。你知道为什么吗?

imageView.image = UIImage(named: "stone") // This returns nil.

xcassets 文件夹

同样,如果我将它们作为文件添加到项目中并通过这种方法访问它们,我创建的一切都很好(或使用像 SDWebImage 这样的库),但我相信我正在失去应用程序细化的能力,因为图像作为文件托管,因此例如 iPhone 7 将在仅需要时同时具有2x3x分辨率2x

extension UIImage {

    convenience init?(heicName: String, useScale: Bool = false) {
        guard let resourcePath = Bundle.main.path(forResource: heicName.fileName(fileExtension: .heic, useScale: useScale), ofType: nil) else {
            return nil
        }

        let url = URL(fileURLWithPath: resourcePath) as CFURL

        guard let source = CGImageSourceCreateWithURL(url, nil),
            let image = CGImageSourceCreateImageAtIndex(source, 0, nil) else {
                return nil
        }

        self.init(cgImage: image)
    }

}

所以我的问题是,任何人都可以向我解释使用 HEIC 作为图像资产文件夹中托管的图像并使其与应用细化兼容的过程(只需获取所需的资源,即 2x、3x)吗?

更新: 在研究更多之后,我意识到当我在图像视图上设置图像名称时,图像是从 IB 加载的。你知道这是如何在内部工作的吗?IB 使用哪个构造函数将 UIImage 设置为 UIImageView?

更新 2: 我已向 Apple 提交了雷达: 雷达

4

2 回答 2

1

Apple 的资产编译器以各种内部格式(一些标准格式和一些专有格式)重新编码进入其中的所有图像,这取决于一系列因素,包括图像类型、目标操作系统版本以及可能的其他因素。不幸的是,在撰写本文时,就 HEIC 文件而言,资产编译器似乎存在问题。如果我尝试将 HEIC 文件放入资产目录,它似乎被遗漏了。图像数据不会复制到 Assets.car 文件中,该文件本身只有 16 KB 大小,仅包含几个空的 B 树。因此,当您尝试使用 加载图像时UIImage,您什么也得不到。

幸运的是,由于资产编译器无论如何都会重新编码所有输入到其中的图像,因此您可以将图像重新编码为另一种格式(我推荐 PNG,因为它是无损的),最终用户收到的结果文件应该与HEIF 输入文件会是什么(具有讽刺意味的是,它可能最终被编码为 HEIF,因为资产格式支持它)。所以这就是我会做的,直到 Apple 在资产编译器中修复这个错误。

于 2018-04-04T01:08:40.067 回答
0

在通过 Radar 和 Apple DTS 进行了大量研究后,我收到了一位工程师联系其他工程团队的以下答复:

“你好,

我的电子邮件开始了一个很长的电子邮件线程,其中涉及许多工程师通过系统跟踪您的问题。最终,他们发现目前使用 jpg 和 png 文件的图像资产和系统的其他部分不支持 HEIC 格式。具体来说,我指的是自动加载的资源,例如那些保存在故事板或其他 Xcode 生成的资源和文件中的资源。目前没有可用的解决方法。

这并不意味着您不能在您的应用程序中使用 HEIC 图像。如果您想在代码中使用 HEIC 图像,则可以使用 Image I/O 来加载图像。

请在以后的操作系统版本中重试。”</p>

TL;博士:

目前还不能在资产文件夹上使用 HEIF。或许在将来。

更新:

在 Xcode 10 beta 5 上测试,现在 Assets.car 包含 HEIF 图像,这表明可以将 HEIF 图像用作资产文件夹的一部分。

于 2018-04-20T18:52:54.810 回答