2011-12-06 13 views
5

से पढ़ें मैं iPhoto लाइब्रेरी से कनेक्ट होने वाला एक एप्लिकेशन बनाना चाहता हूं। तो अब मैं पुस्तकालय से घटनाओं और चित्रों को खुद पढ़ना चाहूंगा।आईफोटो लाइब्रेरी प्रोग्रामेटिक रूप से

क्या ऐसा करने के लिए कोई सुरुचिपूर्ण/आसान तरीका है या क्या मुझे iPhoto उपयोगकर्ता डेटा के बंडल संरचना को मैन्युअल रूप से पढ़ना है? Is there a UIImagePicker for the Mac Desktop

अपडेट::

अब तक मैं केवल एक तस्वीर लेने वाला पाया है मैं किसी अन्य प्रासंगिक अतः पद पाया: Selecting iPhoto images within a cocoa application

उत्तर

5

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

आप App स्टोर अब आप की आवश्यकता सैंडबॉक्स का उपयोग करने के लिए आवश्यक हैं पर क्षुधा को रिहा, इस काम करने से बंद हो जाता है पिछले AppleScript विधि छवियों

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

खोजने के लिए एक ही बात कर सकते हैं (iPhoto ऐप लॉन्च होता है लेकिन एक खाली सेट लौटाया जाता है)।

आईफ़ोटो पुस्तकालयों में एक निर्देशिका संरचना शामिल है जिसमें फ़ोटो, डेटाबेस और एक्सएमएल फ़ाइलें शामिल हैं। सामग्री iPhoto के प्रत्येक संस्करण के साथ बदलती है इसलिए मैन्युअल रूप से इन फ़ाइलों तक पहुंचने पर सावधान रहें।

तुम सिर्फ एल्बम विवरण चाहते हैं तो आप आप तस्वीरें चाहते हैं, तो आप मास्टर्स फ़ोल्डर ब्राउज़ कर सकते हैं AlbumData.xml

फ़ाइल को पार्स कर सकते हैं। आईफ़ोटो में कॉन्फ़िगर किए गए सेट के बजाए फाइल संरचना दिनांक का पालन करती है।

अधिक जानकारी यहां iPhoto लायब्रेरी के आंतरिक भागों पर पाया जा सकता:, http://www.fatcatsoftware.com/iplm/Help/iphoto%20library%20internals.html

डेटाबेस के बहुमत SQLite प्रारूप में हैं और इतने प्रोग्राम के रूप में उद्देश्य सी के माध्यम से पहुँचा जा सकता है, हालांकि फिर आप स्कीमा परिवर्तन की उम्मीद कर सकते iPhoto के विभिन्न संस्करणों के बीच। रुचि के मुख्य डेटाबेस डेटाबेस/apdb में library.apdb और Properties.apdb हैं।


आप अभी भी एप्पल स्क्रिप्ट विधि का उपयोग करना चाहते हैं, यहाँ शामिल एप्पल स्क्रिप्ट निष्पादन भाग के साथ पिछले जवाब का एक संस्करण है:

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); 
} 
संबंधित मुद्दे