Читайте из iPhoto Library программно - PullRequest
5 голосов
/ 06 декабря 2011

Я хочу создать приложение, которое подключается к библиотеке iPhoto. Так что теперь я хотел бы прочитать события и сами фотографии из библиотеки.

Существует ли элегантный / простой способ сделать это или мне нужно вручную прочитать структуру пакета пользовательских данных iPhoto?

На данный момент я нашел только устройство для получения снимков: Есть ли UIImagePicker для рабочего стола Mac

Обновление: я нашел еще один соответствующий пост SO: Выбор изображений iPhoto в приложении какао

Ответы [ 2 ]

5 голосов
/ 14 марта 2012

Вы можете сделать это с помощью NSAppleScript.Это некоторая копия / вставка из моего приложения, немного взломанная, чтобы показать идею.

    NSAppleEventDescriptor d = .. compile this script ..
        @"tell application \"iPhoto\" to properties of albums"

    for (int i = 0; i < [d numberOfItems]; i++)
    {
        NSAppleEventDescriptor *albumDesc = [d descriptorAtIndex:i];

        // <NSAppleEventDescriptor: 'ipal'{ 
        //  'ID  ':4.265e+09, 
        //  'purl':'utxt'("http://www.flickr.com/photos/..."), 
        //  'pnam':'utxt'("Vacation"), 
        //  'alTy':'pubs', 
        //  'alCh':[  ], 
        //  'alPx':'msng' }>

        NSString *albumName = [[albumDesc descriptorForKeyword:'pnam'] stringValue];
        NSString *albumId = [[albumDesc descriptorForKeyword:'ID  '] stringValue];

Вы можете сделать то же самое, чтобы найти изображения

NSString *scp = 
    [NSString stringWithFormat:@"tell application \"iPhoto\" to properties of photos of album id %@",
     [album objectForKey:@"id"]];

NSAppleEventDescriptor *d = ... compile scp ...

// 1 based!?
for (int i = 1; i <= [d numberOfItems]; i++)
{
    NSAppleEventDescriptor *photoDesc = [d descriptorAtIndex:i];

    // Yes.. this happens.  Not sure why?!
    if (!photoDesc)
        continue;

    // <NSAppleEventDescriptor: 'ipmr'{ 
    // 'pnam':'utxt'("IMG_0058.JPG"), 
    // 'pwid':768, 
    // 'pdim':[ 768, 1024 ], 
    // 'alti':1.79769e+308, 
    // 'filn':'utxt'("3133889525_10975ba071_b.jpg"), 
    // 'ipth':'utxt'("/Users/lagnat/Pictures/iPhoto Library/Masters/2010/11/10/20101110-002341/3133889525_10975ba071_b.jpg"), 
    // 'idat':'ldt '($F57C69C500000000$), 
    // 'rate':0, 
    // 'titl':'utxt'("IMG_0058.JPG"), 
    // 'phit':1024, 
    // 'itpt':'utxt'("/Users/lagnat/Pictures/iPhoto Library/Thumbnails/2010/11/10/20101110-002341/3133889525_10975ba071_b.jpg.jpg"), 
    // 'ID  ':4.295e+09, 
    // 'lati':'msng', 
    // 'pcom':'utxt'(""), 
    // 'opth':'utxt'("/Users/lagnat/Pictures/iPhoto Library/Masters/2010/11/10/20101110-002341/3133889525_10975ba071_b.jpg"), 
    // 'lngt':'msng', 
    // 'tiln':'utxt'("3133889525_10975ba071_b.jpg.jpg") }>

    NSString *path = [[photoDesc descriptorForKeyword:'ipth'] stringValue];
    NSString *imgname = [[photoDesc descriptorForKeyword:'pnam'] stringValue];
1 голос
/ 04 ноября 2013

Если при выпуске приложений в App Store теперь требуется использование песочницы, это останавливает работу предыдущего метода AppleScript (приложение iPhoto запускается, но возвращается пустой набор).

Библиотеки iPhotoсостоят из структуры каталогов, содержащих фотографии, базы данных и файлы XML.Содержание меняется с каждой версией iPhoto, поэтому будьте осторожны при ручном доступе к этим файлам.

Если вы просто хотите получить сведения об альбоме, вы можете проанализировать файл AlbumData.xml

Если вам нужны фотографии, которые выможете просматривать папку мастеров.Структура файлов соответствует дате, а не наборам, настроенным в iPhoto.

Дополнительную информацию о внутренностях библиотеки iPhoto можно найти здесь: http://www.fatcatsoftware.com/iplm/Help/iphoto%20library%20internals.html

Большинство баз данных находятся вК формату SQLite и т. Д. Можно получить программный доступ через Objective C, хотя опять-таки можно ожидать изменения схемы между различными версиями iPhoto.Основными интересующими базами данных являются Library.apdb и Properties.apdb в базе данных / apdb.


Если вы все еще хотите использовать метод Apple Script, вот версия предыдущего ответа с выполнением сценария Appleчасть включена:

NSAppleScript *script = [[NSAppleScript alloc] initWithSource:@"tell application \"iPhoto\" to properties of albums"];
NSAppleEventDescriptor *d = [script executeAndReturnError:nil];

NSLog(@"photo library count: %ld", (long)[d numberOfItems]);

for (int i = 0; i < [d numberOfItems]; i++)
{
    NSAppleEventDescriptor *albumDesc = [d descriptorAtIndex:i];

    NSString *albumName = [[albumDesc descriptorForKeyword:'pnam'] stringValue];
    NSLog(@"%@", albumName);
}
...