Изображения HEIC в папке ресурсов не загружены

Я поставил .heic изображения в моем xcassets папка из моего проекта, чтобы сэкономить место. Однако я не могу загрузить их через UIImage(named:) конструктор. Я всегда получаю nilтак что единственный способ загрузить их - указать URL. У тебя есть идеи почему?

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

папка xcassets

Опять же, если я добавляю их в проект в виде файлов и получаю к ним доступ с помощью этого метода, я создал все в порядке (или использую библиотеки, такие как SDWebImage), но я считаю, что теряю силу утончения приложения, поскольку изображения размещаются в виде файлов. так, например, iPhone 7 будет иметь оба 2x а также 3x разрешения, когда только 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: Радар

3 ответа

Решение

После большого исследования, проведенного через Radar и Apple DTS, я получил следующий ответ от инженера, который связался с другими командами инженеров:

"Привет,

В моем письме началась длинная цепочка сообщений, в которой участвовали несколько инженеров, отслеживающих ваш вопрос через систему. В конце концов они обнаружили, что формат HEIC не поддерживается в активах изображений и в других частях системы в настоящее время, где в настоящее время используются файлы jpg и png. В частности, я имею в виду автоматически загружаемые ресурсы, такие как сохраненные в раскадровках или других ресурсах и файлах, созданных XCode. В настоящее время нет доступных обходных путей.

Это не означает, что вы не можете использовать изображения HEIC в своем приложении. Если вы хотите использовать изображение HEIC в своем коде, вы можете использовать Image I/O для загрузки изображения.

Пожалуйста, попробуйте еще раз в будущих версиях операционной системы ".

TL;DR:

Пока нельзя использовать HEIF в папке активов. Может быть в будущем.

ОБНОВИТЬ:

Протестировано на Xcode 10 beta 5, и теперь Assets.car содержит изображения HEIF, что указывает на возможность использования изображений HEIF как части папки активов.

Компилятор ресурсов Apple перекодирует все изображения, которые входят в него, во множестве внутренних форматов, некоторых стандартных и некоторых проприетарных, в зависимости от множества факторов, включая тип изображения, целевую версию ОС и, возможно, другие факторы. К сожалению, на момент написания этой статьи, компилятор ресурсов, кажется, глючил, что касается файлов HEIC; если я попытаюсь поместить файл HEIC в каталог активов, он, похоже, будет опущен. Данные изображения не копируются в файл Assets.car, размер которого составляет всего 16 КБ и содержит только несколько пустых B-деревьев. Поэтому при попытке загрузить изображение с помощью UIImageВы ничего не получите.

К счастью, поскольку компилятор ресурсов перекодирует все изображения, поступающие в него, в любом случае, вы можете просто перекодировать ваши изображения в другой формат (я рекомендую PNG, так как он без потерь), и полученный файл, который получит конечный пользователь, должен быть идентичен что это было бы с входным файлом HEIF (и по иронии судьбы, это могло бы в конечном итоге быть закодировано как HEIF, так как формат активов это поддерживает). Вот что я буду делать, пока Apple не исправит эту ошибку в компиляторе ресурсов.

  • Xcode 15.0 Бета 5
  • iOS17.0
  • Первый шаг: измените расширение файла изображения HEIF на .heif xxx.HEIC -> xxx.heif.
  • Второй шаг: перетащите файл в папку проекта xcode.
  • Третий шаг: перейдите в настройки проекта. Этапы сборки — копирование ресурсов пакета, добавьте файл xxx.heif.
  • Наконец, я могу прочитать изображение с помощью CGImageSourceCreateWithData (используйте
    Bundle.main.path, чтобы получить путь, затем NSDatacontentsOfFile).

Обратите внимание, что это может быть не лучшей практикой!

Другие вопросы по тегам