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.
- 1. Imposta l'icona di non app mac os x bundle
- 2. rmagick e imagemagick bundle/homebrew error
- 3. App native di OS X in JS?
- 4. TClientDataset in OS X Firemonkey App
- 5. Collegamento statico wxHaskell su Mac OS X
- 6. Problema con Virtualenv su Mac OS X
- 7. Utilizzo di Google App Engine SDK con Python 2.7 su Mac OS X 10.6
- 8. utilizzando PEAR con MAC OS X
- 9. Flask ImportError con bson su OS X
- 10. Compatibilità con OS X Mavericks con R
- 11. SSLError in Richieste durante il confezionamento come OS X .app
- 12. Framework di sviluppo di app per OS X
- 13. XCode 5 debug remoto delle app OS X
- 14. Symbol X OS X Crash Log Symbol
- 15. Cosa viene memorizzato in ~/Library/Caches/<my-app-bundle> /Cache.db?
- 16. Debug e uccisione di app su Mac OS X?
- 17. Oggi Widget su OS X non funziona
- 18. Pre-Amplify Audio OS X
- 19. Come creare pgmagick sotto pythonbrew su OS X?
- 20. Numpy-MKL per OS X
- 21. OS X clang -pthread
- 22. Mac OS X - Come archiviare progetti Web in una posizione diversa da/Library
- 23. Installa pip su OS X
- 24. Errore durante l'installazione RMySQL su OS X
- 25. Conflitto MAMP con OS X Lion Apache
- 26. Utilizzando clang_complete con OS X framework
- 27. Problemi di collegamento con OS X 10.10
- 28. Sviluppo Symbian C++ con Mac OS X
- 29. Come abilitare la registrazione con Postgres.app su OS X?
- 30. ca-certificates Mac OS X
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