HEIC/HEIF Поддерживается UIImage

У меня сложилось впечатление, что UIImage будет поддерживать файлы HEIC/HEIF, представленные в iOS 11. Однако в моем тестировании это не так. Если я позволю image = UIImage(named: "test"), который указывает на test.heic, тогда image будет nil. Если я использую литерал изображения, то приложение вылетает. Хотите знать, если это еще не реализовано на данный момент. Благодарю.

2 ответа

Решение

Хотя ответ Чжао работает, он довольно медленный. Ниже примерно в 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)
}

Это как-то обрисовано в общих чертах на странице 141 из слайдов сеанса WWDC, но раньше мне это было не совсем понятно: https://devstreaming-cdn.apple.com/videos/wwdc/2017/511tj33587vdhds/511/511_working_with_heif_and_hevc.pdf

К сожалению, я до сих пор не смог найти способ использовать изображения в папке xcassets, поэтому вам придется либо включать файлы за пределы ресурсов, либо извлекать их из Интернета. Если кто-нибудь знает способ обойти это, пожалуйста, напишите.

В Xcode 10.1 (10B61) UIImage(named: "YourHeifImage") работает так же, как другие активы.


Интересно, что если вы захотите попробовать это... и вы AirDrop сделаете фотографию HEIF из ваших (например, iPhone) фотографий на ваш Mac, он получит расширение .HEIC (все заглавные буквы). Когда вы затем добавляете это изображение в свой XCase-код XCode, XCode жалуется на неправильное расширение:

….Xcassets: warning: неоднозначное содержимое: набор изображений "IMG_1791" ссылается на файл "IMG_1791.HEIC", но этот файл не имеет допустимого расширения.

Если вы сначала измените расширение на нижний регистр .heic, а затем добавить его в xcassets, все хорошо.

Вы можете загрузить HEIF через CIImage, а затем конвертировать в UIImage

CIImage *ciImage = [CIImage imageWithContentsOfURL:url];
imageView.image = [UIImage imageWithCIImage:ciImage];
Другие вопросы по тегам