2011-12-06 20 views
5

iPhoto Kitaplığı'na bağlanan bir Uygulama oluşturmak istiyorum. Şimdi olayları ve resimleri kütüphaneden okumak istiyorum.iPhoto Library'den programatik olarak okuyun

Bunu yapmanın zarif/kolay bir yolu var mı, yoksa iPhoto Kullanıcı Verilerinin Paket Yapısını manuel olarak okumak zorunda mıyım? Is there a UIImagePicker for the Mac Desktop

Güncelleme:

Bugüne kadar yalnızca bir resim taker bulduk ben başka alakalı SO sonrası bulundu: Selecting iPhoto images within a cocoa application

cevap

5

Sen NSAppleScript ile bunu yapabilirsiniz. Bu benim app biraz kopyala/yapıştır, sadece fikir göstermek için biraz kesmek.

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]; 

şimdi artık Sandbox kullanmak için gerekli gerekli olan App Store üzerinde uygulamalar bırakmadan, bu çalışmasını önceki AppleScript yöntemini durursa görüntüleri

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

bulmak için aynı şeyi yapabilir (iPhoto uygulaması başlatılır, ancak boş bir set döndürülür).

iPhoto kütüphaneleri, fotoğrafları, veritabanlarını ve XML dosyalarını içeren bir dizin yapısından oluşur. İçindekiler iPhoto'nun her sürümü ile değişir, bu nedenle bu dosyalara manuel olarak erişilirse dikkatli olun.

sadece albüm ayrıntılarını istiyorsanız size Ustalar klasör göz atabilirsiniz fotoğrafları isterseniz

AlbumData.xml dosyası ayrıştırabilir. Dosya yapısı, iPhoto'da yapılandırılan kümeler yerine tarihler izler.

fazla bilgi burada iPhoto kütüphanesinin iç donanım üzerinde bulunabilir : tekrar şema değişiklikleri bekleyebilirsiniz olsa veritabanları çoğunluğu SQLite formatında ve böylece programlı Objective C aracılığıyla erişilebilir http://www.fatcatsoftware.com/iplm/Help/iphoto%20library%20internals.html

iPhoto'nun farklı sürümleri arasında. Ana veri tabanları Database/apdb'de Library.apdb ve Properties.apdb'dir.


yine Apple komut dosyası yöntemini kullanmak istiyorsanız, buraya dahil Elma komut dosyası yürütme kısmı ile önceki cevabın bir sürümü:

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); 
} 
İlgili konular