Как вставить 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, чтобы понять структуру тегов и каталогов:

Спецификация TIFF 6.0

Далее, посмотрите на спецификацию JPEG EXIF:

EXIF 2.2 Spec

Я ожидал бы, что существующее программное обеспечение 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);
Другие вопросы по тегам