Как вставить exif метаданные в изображение, не копируя изображение?
Ранее я задавал этот вопрос: как записать метаданные exif в изображение.
Теперь я нашел способ ввести метаданные. Однако это приводит к копированию изображения в память. С большими изображениями и необходимостью уже иметь копию в памяти это будет иметь производительность и, возможно, приведет к сбою памяти.
Есть ли правильный способ ввода метаданных без необходимости делать копию изображения? Возможно, его можно прикрепить к файлу после его записи на диск?
Я бы предпочел нативные реализации, не прибегая к сторонней библиотеке только для этого, если это вообще возможно.
3 ответа
Этот вопрос может потребовать небольшого или большого количества кода в зависимости от того, что вам нужно. Данные EXIF хранятся в маркере JPEG APP1 (FFE1). Он очень похож на файл TIFF с заголовком TIFF, IFD и отдельными тегами с данными. Если вы можете построить свой собственный сегмент маркера APP1, то вставка или замена его в файл JPEG является тривиальной задачей. Если вы хотите прочитать метаданные из существующего файла, добавьте несколько новых тегов, а затем запишите их обратно, что может быть более сложным. Сложной частью данных EXIF являются те теги, которые требуют более 4 байтов. Каждый тег TIFF имеет 12 байтов: 2-байтовый тег, 2-байтовый тип данных, 4-байтовый счетчик, 4-байтовые данные. Если данные не помещаются полностью в 4 байта тега, то тег указывает абсолютное смещение в файле, где найти данные. Если в существующих данных есть какие-либо теги с такими данными (например, марка, модель, дата захвата, время захвата и т. Д.), Вам нужно будет упаковать эти данные, исправив смещения, а затем добавить свои собственные. В двух словах:
1) Если вы добавляете готовый маркер APP1 в файл JPEG, это просто и требует небольшого кода.
2) Если вам нужно прочитать существующие метаданные из файла JPEG, добавить свои собственные и записать их обратно, код немного сложнее. Это не "сложно", но включает в себя гораздо больше, чем просто чтение и запись блоков данных.
Начните с чтения спецификации TIFF 6.0, чтобы понять структуру тегов и каталогов:
Далее, посмотрите на спецификацию JPEG EXIF:
Я ожидал бы, что существующее программное обеспечение exif-манипулятора может это сделать, но не проверялось.
Ссылки:
CGImageSourceRef может использоваться для получения свойств изображения, включая его миниатюру, без загрузки всех данных изображения в память. Таким образом, память не тратится впустую UIImage и NSData.
CGImageSourceRef imageSource = CGImageSourceCreateWithURL((CFURLRef)[NSURL fileURLWithPath:path], NULL);
Затем сохраните CGImageDestinationRef, добавив исходное изображение и exif-данные.
CGImageDestinationAddImageFromSource (destRef,
imageSource,
0,
(CFDictionaryRef)propertes );//exif
BOOL success = CGImageDestinationFinalize(destRef);