2011-12-06 10 views
5

iPhotoライブラリに接続するアプリケーションを作成したいと思います。ですから、イベントや写真そのものを図書館から読んでみたいと思います。iPhotoライブラリからプログラムで読む

これを行うためのエレガントで簡単な方法はありますか、またはiPhotoユーザーデータのバンドル構造を手動で読み取る必要がありますか? Is there a UIImagePicker for the Mac Desktop

更新:

は、これまでのところ私は絵の受け手を見つけた私は、他の関連するSOのポストを見つけました: 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 Storeでリリースアプリは今、サンドボックスを使用するために必要な場合は、画像

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

を見つけるために、同じことを行うことができ、これは、作業から、以前のAppleScript方法を停止します(iPhotoアプリが起動しますが、空のセットが返されます)。

iPhotoライブラリは、写真、データベース、およびXMLファイルを含むディレクトリ構造で構成されています。これらのファイルに手動でアクセスする場合は注意が必要です。

あなただけのアルバムの詳細が必要な場合、あなたがマスターズフォルダを閲覧することができます写真をご希望の場合は、

AlbumData.xmlファイルを解析することができます。ファイルの構造は、iPhotoで設定されたセットではなく、日付に従います。

詳しい情報はこちらをiPhotoライブラリの内部で見つけることができる :もう一度あなたがスキーマの変更を期待することができますが、データベースの大半はSQLiteの形式であるので、プログラムのObjective Cを介してアクセスすることができ http://www.fatcatsoftware.com/iplm/Help/iphoto%20library%20internals.html

iPhotoの異なるバージョン間で重要な主なデータベースは、Database/apdbのLibrary.apdbとProperties.apdbです。


それでもアップルスクリプトメソッドを使用したい場合は、ここに付属の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); 
}