Nano Hash - криптовалюты, майнинг, программирование

Обнаружение того, что данные изображения iOS являются HEIF или HEIC

Мой сервер не поддерживает формат HEIF. Поэтому мне нужно преобразовать его в JPEG перед загрузкой из моего приложения.

Я делаю это:

UIImage *image = [UIImage imageWithData:imageData];                                 
NSData *data=UIImageJPEGRepresentation(image, 1.0);

Но как я могу узнать, что это данные HEIF (или HEIC)? Я могу посмотреть файл:

([filePath hasSuffix:@".HEIC"] || [filePath hasSuffix:@".heic"])

Но я не думаю, что это хороший ответ. Есть ли другое решение?


Ответы:


1

Оба существующих ответа имеют хорошие рекомендации, но попытаться рассказать всю историю...

UIImage не представляет собой файл изображения или даже двоичные данные в формате файла изображения. UIImage лучше всего рассматривать как абстрактное представление отображаемого изображения, закодированного в этих данных, то есть UIImage является результатом процесса декодирования. К тому времени, когда у вас есть объект UIImage, уже неважно, из какого формата файла он был получен.

Итак, как отмечает @Ladislav answer, если у вас уже есть UIImage и вы просто хотите получить данные в определенном файле изображения format вызовите одну из удобных функций для преобразования UIImage в данные в формате файла. Как следует из названия, UIImageJPEGRepresentation возвращает данные, подходящие для записи в файл JPEG.

Если у вас уже есть UIImage, UIImageJPEGRepresentation, вероятно, будет лучшим выбором, так как вы можете использовать его независимо от исходного формата изображения.


Как подразумевает @ScottCorscadden, если у вас нет UIImage (пока), потому что вы работаете на более низком уровне, например что у вас есть доступ к исходным данным файла, вам нужно будет проверить эти данные, чтобы определить их формат, или запросить у любого источника, из которого вы получили данные, метаданные, описывающие его формат.

Если вы хотите проверить сами данные, вам лучше всего ознакомиться со стандартами формата HIEF. См. nokiatech, группа MPEG или википедия.

В формате контейнера HEIF и возможных типах носителей, которые могут храниться внутри, происходит много всего, поэтому решить, есть ли у вас не просто файл HEIF, а файл HEIF/HEVC, совместимый с тем или иным средством просмотра, может быть непросто. . Поскольку вы говорите об исключении вещей, которые ваш сервер не поддерживает, может быть проще кодировать с точки зрения включения только вещей которые ваш сервер поддерживает. То есть, если у вас есть данные без метаданных, найдите что-то вроде магического числа JPEG 0xffd8ff и используйте его, чтобы исключить все, что не является JPEG.

Однако лучше поискать метаданные. Если вы выбираете изображения из библиотеки фотографий с помощью PHImageManager.requestImageData(for:options:resultHandler:), Второй параметр обработчика результатов — это универсальный идентификатор типа. для данных изображения: для файлов HEIF и HEIC в дикой природе были обнаружены public.heif, public.heif-standard и public.heic.

(Опять же, если вы ищете «изображения, которые мой сервер не поддерживает», вам лучше проверить форматы, которые ваш сервер поддерживает, и отклонить все, что не входит в этот список, а чем пытаться определить все возможные неподдерживаемые форматы.)

27.10.2017

2

Когда вы отправляете на свой сервер, вы, скорее всего, декодируете UIImage и отправляете его как Data, так что просто сделайте

let data = UIImageJPEGRepresentation(image, 0.9)

Просто решите, какое качество вам больше всего подходит, здесь оно 0,9.

19.10.2017
  • Спасибо. Но как я могу узнать, что это данные HEIF (или HEIC)? Просто оцените, какой суффикс у файла? 20.10.2017

  • 3

    Ну, вы могли бы посмотреть на магические байты - JPEG и PNG, безусловно, известны, и я, кажется, вижу некоторые ссылки на то, что HEIF (.heic) начинается с байта NUL. Если вы используете какой-либо из методов PHImageManager, таких как requestImageDataForAsset:options:resultHandler, этому обработчику результатов будет передана ссылка NSString * _Nullable dataUTI. По этому поводу есть достойное видео/слайды WWDC (возможно, здесь), которые предполагают, что если UTI не является kUTTypeJPEG, вы конвертируете его (и на слайдах есть пример кода более низкого уровня в Swift, который также сохраняет ориентацию).

    Я также должен упомянуть, что если у вас есть контроль на уровне вашего приложения и все загрузки происходят оттуда, делайте все это там.

    27.10.2017

    4

    Если вы используете Photos фреймворк и импортируете изображения из библиотеки фотографий, есть решение, кратко упомянутое на WWDC17. Во-первых, импортируйте основные сервисы:

    import MobileCoreServices
    

    Затем, когда вы запрашиваете изображение, проверьте UTType, который возвращается в качестве второго параметра вашего блока:

    // asset: PHAsset
    PHImageManager.default().requestImageData(for: asset, options: nil) { imageData, dataUTI, orientation, info in
      guard let dataUTI = dataUTI else { return }
      if !(UTTypeConformsTo(dataUTI as CFString, kUTTypeJPEG) || UTTypeConformsTo(dataUTI as CFString, kUTTypePNG)) {
        // imageData is neither JPG not PNG, possibly subject for transcoding
      }
    }
    

    Другие UTTypes можно найти здесь

    22.06.2018

    5

    Немного поздно для вечеринки, но помимо проверки расширения (после последней точки), вы также можете проверить «магическое число», также известное как подпись файла. Байты с 5 по 8 должны дать вам константу «ftyp». Следующие 4 байта будут основным брендом, который, как я полагаю, является одним из «mif1», «heic» и «heix». Например, первые 12 байт изображения .heic будут такими:

    00 00 00 18 66 74 79 70 6d 69 66 31

    который после удаления 0 и обрезки результата буквально декодировался до ftypmif1.

    19.06.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..