gpt4 book ai didi

swift - 未加载 Assets 文件夹中的 HEIC 图像

转载 作者:IT王子 更新时间:2023-10-29 05:53:36 28 4
gpt4 key购买 nike

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

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

xcassets folder

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

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 作为图像 Assets 文件夹中托管的图像并使其与应用程序瘦身兼容(只需获取所需资源,即 2x、3x)的过程吗?

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

更新 2:我已经向 Apple 提交了一个雷达: Radar

最佳答案

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

幸运的是,由于 Assets 编译器会重新编码输入的所有图像无论如何,您只需将图像重新编码为另一种格式(我推荐 PNG,因为它是无损的),以及生成的文件最终用户收到的内容应该与 HEIF 输入文件的内容相同(具有讽刺意味的是,它可能最终被编码为 HEIF,因为 Assets 格式支持它)。所以在 Apple 修复 Assets 编译器中的这个错误之前,我会这样做。

关于swift - 未加载 Assets 文件夹中的 HEIC 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49449820/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com