Записать данные IPTC в файл
Мне нужно будет взять существующий файл JPG и изменить заголовок, описание и ключевые слова в его записях IPTC. Здесь есть несколько тем, но все либо без ответа, либо с частичными ответами. Я уже знаю, как читать информацию IPTC, но нужно будет их редактировать. Может ли кто-нибудь пролить свет на эту очень изученную и менее известную тему?
что у меня есть:
NSString: title
NSString: description
NSArray: keywords
NSString: path to the file
Я хотел бы взять существующее изображение с существующими данными IPTC и заменить существующие записи этими, но сохранить все другие записи IPTC, такие как местоположение, дата и так далее. Пока я знаю только то, что мне нужно использовать CGImageDestination.
Спасибо
2 ответа
Сначала вы должны прочитать метаданные из файла:
CGImageSourceRef source = CGImageSourceCreateWithURL((__bridge CFURLRef)url, NULL);
NSDictionary *props = (__bridge_transfer NSDictionary *) CGImageSourceCopyPropertiesAtIndex(source, 0, NULL);
В приведенном выше коде url
URL вашего файла изображения. props
будет иметь все метаданные изображения по целевому URL.
Затем вы копируете эти данные в новый изменяемый, пустой источник данных:
//new empty data to write the final image data to
NSMutableData *resultData = [NSMutableData data];
CGImageDestinationRef imgDest = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)(resultData), imageType, 1, NULL);
Наконец, давайте предположим, что вы изменили метаданные в новом NSDictionary
экземпляр (называется modifiedMetadata
в этом примере):
//copy image data
CGImageDestinationAddImageFromSource(imgDest, source, 0, (__bridge CFDictionaryRef)(modifiedMetadata));
BOOL success = CGImageDestinationFinalize(imgDest);
Это позволит записать метаданные в целевое изображение. По крайней мере, в моем случае это работает отлично.
Чтобы сохранить данные изображения в реальном файле, вы можете регулярно записывать данные, например:
[resultData writeToFile:fileName atomically:YES];
Вы должны использовать XMP Toolkit SDK, вы можете найти подробную информацию на странице Adobe SDK. Реализация немного сложна, но как только вы добавите статические библиотеки в свой проект, вы сможете читать и записывать информацию XMP, она покрывает пространство имен IPTC, а также другие пространства имен, как dublin. и т.д.
После того, как вы добавите библиотеки в код проекта, как это.
#include "XMP.incl_cpp"
#include "XMP.hpp"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
-(void)readIPTC
{
SXMPMeta::Initialize()
SXMPMeta imageMeta;
if(imageMeta.DoesPropertyExist(kXMP_NS_DC, "title"))
{
std::string MyString;
imageMeta.GetArrayItem(kXMP_NS_DC, "title", 1, &MyString, 0);
[textField setStringValue:[NSString stringWithCString:MyString.c_str() encoding:[NSString defaultCStringEncoding]]];
}
}
написание почти такое же.
imageMeta.SetProperty(<#XMP_StringPtr schemaNS#>, <#XMP_StringPtr propName#>, <#XMP_StringPtr propValue#>)
Вы можете найти все константы пространства имен в документации, например, kXMP_NS_DC XMP NameSpace DublinCore и т. д.
Image/IO от Apple предполагает охват всего, кроме, например, вы можете читать пост-запись из IPTC с помощью Image/IO, но вы не можете ее написать.