Изображения 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: Radar


person jomafer    schedule 23.03.2018    source источник
comment
У меня нет хорошего имиджа. Не могли бы вы поделиться, откуда я могу скачать его?   -  person Sagar Chauhan    schedule 28.03.2018
comment
Вы не можете сделать это, потому что ресурсы не поддерживают heic. Вы можете конвертировать heic в JPG/PNG, пожалуйста, прочитайте это devstreaming-cdn.apple.com/videos/wwdc/2017/511tj33587vdhds/511/   -  person a.masri    schedule 29.03.2018
comment
@a.masri HEIC поддерживается активами, см. документация Apple   -  person Daniel    schedule 30.03.2018
comment
однако он не совместим с UIImage и истончением приложений.   -  person Daniel    schedule 30.03.2018
comment
Дэниел, вы знаете, как работает IB с точки зрения назначения UIImage выходу UIImageView? Формат Heic работает там из папки с активами, но я не знаю, каков внутренний механизм установки изображения в UIImageView.   -  person jomafer    schedule 04.04.2018
comment
Когда я создаю каталог активов, содержащий файлы HEIF, кажется, что изображения физически вообще не хранятся в каталоге активов. В итоге я получил файл Assets.car размером всего 16 КБ, который содержит только пустые деревья и не содержит фактических данных.   -  person Charles Srstka    schedule 04.04.2018
comment
Действительно? В моем случае я вижу ту же структуру папок, что и в png, т. е. содержимое.json и активы в формате HEIC.   -  person jomafer    schedule 04.04.2018


Ответы (2)


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

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

person Charles Srstka    schedule 04.04.2018
comment
Вы в этом уверены? Если вы создадите новый набор изображений и перетащите изображение HEIC внутрь (1x, 2x или 3x), вы увидите его в папке ресурсов рядом с файломcontents.json. - person jomafer; 04.04.2018
comment
@jomafer В исходном каталоге да. Но смотрели ли вы в скомпилированном двоичном файле? Когда я это делаю, его там нет. - person Charles Srstka; 04.04.2018
comment
Я написал Apple об этом как об уровне покрытия, и они сказали мне, что я могу использовать платформу ImageIO для доступа к изображениям HEIC из папки ресурсов, но я не знаю, как получить URL-адрес из папки ресурсов, чтобы использовать CGImageSourceCreateWithURL. Есть идеи? - person jomafer; 10.04.2018
comment
Определенно вы правы, я попробовал несколько способов добавить ресурсы в папку ресурсов, но изображения HEIC не включены в IPA. - person jomafer; 10.04.2018
comment
@jomafer В IPA нет папки для активов. Все изображения в каталоге ресурсов перекодируются и копируются в файл Assets.car собственного формата. К сожалению, файлы HEIC, похоже, не сохраняются, и я на 99% уверен, что это ошибка. Таким образом, в качестве временного обходного пути, пока это не будет исправлено, вы можете либо поместить перекодированные файлы PNG в каталог активов, либо вы можете взять изображения из каталога активов и просто включить их как простые старые ресурсы (а затем получить URL-адреса через Bundle API ). - person Charles Srstka; 10.04.2018
comment
Извините, я имел в виду файл Assets.car. Я открыл, и, как вы подтвердили, изображений HEIC там нет. Кто-то из Apple сказал мне, что HEIC является для них относительно новым, и они могут еще не поддерживать его. Так что буду продолжать работать с Радаром. Будем держать вас в курсе - person jomafer; 11.04.2018

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

“Hi,

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

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

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

TL;DR:

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

ОБНОВЛЕНИЕ:

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

person jomafer    schedule 20.04.2018