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
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 :-)
Possibile? Sì. Molte app lo hanno fatto, ma può essere noioso.
NSTask consente variabili di ambiente personalizzate.
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
Non sapevo che NSTask permettesse variabili di ambiente ... Potrei riuscire a farlo funzionare :) Se trovo una soluzione, la pubblicherò qui. – Nippysaurus
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