2011-01-23 15 views
7

Sto sviluppando un'applicazione OS X e desidero utilizzare ImageMagick per eseguire alcune manipolazioni di immagini. Ho notato che le utilità CLI ImageMagick richiedono alcune variabili di ambiente per funzionare. È possibile raggruppare la suite di strumenti ImageMagick con la mia applicazione e usarli nel mio codice?Bundle ImageMagick library con OS X App?

risposta

10

Quindi, ecco la mia soluzione:

ho impacchettato il rilascio OS X binary con il mio progetto, e ha utilizzato un NSTask per chiamare i binari. È necessario specificare le variabili di ambiente "MAGICK_HOME" e "DYLD_LIBRARY_PATH" affinché NSTask funzioni correttamente. Ecco il frammento di ciò che sto usando.

Si noti che questo esempio è codificato in modo rigido per utilizzare il comando "composito" ... e utilizza argomenti codificati in modo rigido, ma è possibile modificarlo in qualsiasi modo si desideri ... è solo una dimostrazione del concetto.

-(id)init 
{ 
    if ([super init]) 
    { 
     NSString* bundlePath = [[NSBundle mainBundle] bundlePath]; 
     NSString* imageMagickPath = [bundlePath stringByAppendingPathComponent:@"/Contents/Resources/ImageMagick"]; 
     NSString* imageMagickLibraryPath = [imageMagickPath stringByAppendingPathComponent:@"/lib"]; 

     MAGICK_HOME = imageMagickPath; 
     DYLD_LIBRARY_PATH = imageMagickLibraryPath; 
    } 
    return self; 
} 

-(void)composite 
{ 
    NSTask *task = [[NSTask alloc] init]; 

    // the ImageMagick library needs these two environment variables. 
    NSMutableDictionary* environment = [[NSMutableDictionary alloc] init]; 
    [environment setValue:MAGICK_HOME forKey:@"MAGICK_HOME"]; 
    [environment setValue:DYLD_LIBRARY_PATH forKey:@"DYLD_LIBRARY_PATH"]; 

    // helper function from 
    // http://www.karelia.com/cocoa_legacy/Foundation_Categories/NSFileManager__Get_.m 
    NSString* pwd = [Helpers pathFromUserLibraryPath:@"MyApp"]; 

    // executable binary path 
    NSString* exe = [MAGICK_HOME stringByAppendingPathComponent:@"/bin/composite"]; 

    [task setEnvironment:environment]; 
    [task setCurrentDirectoryPath:pwd]; // pwd 
    [task setLaunchPath:exe]; // the path to composite binary 
    // these are just example arguments 
    [task setArguments:[NSArray arrayWithObjects: @"-gravity", @"center", @"stupid hat.png", @"IDR663.gif", @"bla.png", nil]]; 
    [task launch]; 
    [task waitUntilExit]; 
} 

Questa soluzione bundle il grosso della intera libreria con il rilascio (37MB al momento), quindi potrebbe essere meno che ideale per alcune soluzioni, ma si sta lavorando :-)

2

Possibile? Sì. Molte app lo hanno fatto, ma può essere noioso.

NSTask consente variabili di ambiente personalizzate.

+0

Cerco fare la stessa cosa Qualsiasi aiuto sarebbe buono AFAIK ImageMagick supporta solo percorsi assoluti, quindi non è possibile utilizzare ad esempio tilds nel percorso ad esso. Quindi, anche se NSTask funziona, sono stato solo Apple a mettere le librerie di ImageMagick nella zona "/" di qualsiasi HD su cui installo l'app. Ci sono API MagickWand MagickCore PerlMagick Magick ++, Ma non sono ancora stato Apple a scoprirle! – markhunte

+0

Non sapevo che NSTask permettesse variabili di ambiente ... Potrei riuscire a farlo funzionare :) Se trovo una soluzione, la pubblicherò qui. – Nippysaurus

+1

Se ImageMagick crea dylibs, un trucco potrebbe essere quello di passare alle variabili di ambiente DYLD_ *. Tuttavia, sarebbe molto meglio ricostruire i binari e le librerie di ImageMagick per supportare l'incorporamento. So che è stato fatto prima, ma non ho dettagli. Google può aiutare, ne sono sicuro. – bbum