Как вставить exif метаданные в изображение, не копируя изображение? - PullRequest
4 голосов
/ 22 марта 2012

Ранее я задавал этот вопрос: Как записать метаданные exif в изображение .

Теперь я нашел способ вставлять метаданные. Однако это приводит к копированию изображения в память. С большими изображениями и необходимостью уже иметь копию в памяти это будет иметь производительность и, возможно, приведет к сбою памяти.

Существует ли правильный способ ввода метаданных без необходимости делать копию изображения? Возможно, его можно прикрепить к файлу после его записи на диск?

Я бы предпочел нативные реализации, не прибегая к сторонней библиотеке только для этого, если это вообще возможно.

Ответы [ 3 ]

1 голос
/ 27 марта 2012

Этот вопрос может потребовать небольшого или большого количества кода в зависимости от того, что вам нужно.Данные 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

0 голосов
/ 01 апреля 2012

CGImageSourceRef может использоваться для получения свойств изображения, включая его миниатюру, без загрузки всех данных изображения в память. Таким образом, память UIImage и NSData не теряется.

CGImageSourceRef imageSource = CGImageSourceCreateWithURL((CFURLRef)[NSURL fileURLWithPath:path], NULL);

Затем сохраните CGImageDestinationRef, добавив исходное изображение и exif-данные.

CGImageDestinationAddImageFromSource (destRef,    
                                      imageSource,
                                      0,
                                     (CFDictionaryRef)propertes );//exif
BOOL success = CGImageDestinationFinalize(destRef);
0 голосов
/ 29 марта 2012

Я ожидаю, что существующее программное обеспечение exif-манипулятора может это сделать, но еще не протестировало.

Ссылки:

...