Pracuję nad aplikacją OS X i chciałbym użyć ImageMagick do manipulowania obrazem. Zauważyłem, że narzędzia CLI ImageMagick wymagają działania niektórych zmiennych środowiskowych. Czy jest możliwe połączenie zestawu narzędzi ImageMagick z moją aplikacją i użycie ich w moim kodzie?Paczka biblioteki ImageMagick z aplikacją OS X?
Odpowiedz
Więc tu jest moje rozwiązanie:
I dołączone do OS X binary zwolnienie z mojego projektu, i użył NSTask zadzwonić pliki binarne. Musisz określić zmienne środowiskowe "MAGICK_HOME" i "DYLD_LIBRARY_PATH", aby NSTask działał poprawnie. Oto fragment tego, z czego korzystam.
Zauważ, że ten przykład jest zakodowany na sztywno, aby użyć komendy "composite" ... i używa argumentów zakodowanych na sztywno, ale możesz go zmienić na cokolwiek chcesz ... służy tylko jako dowód koncepcji.
-(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];
}
Rozwiązanie wiązki większość całej biblioteki ze swoim wydaniu (37MB w tej chwili), więc może to być mniej niż idealne dla niektórych rozwiązań, ale to działa :-)
Możliwe? Tak. Wiele aplikacji tak zrobiło, ale może być uciążliwe.
NSTask pozwala na niestandardowe zmienne środowiskowe.
- 1. Brakuje OS X 10.8 biblioteki mod _ * _ svn.so
- 2. Dylibs i OS X
- 3. Czy aplikacja Mac OS X może uniemożliwić dlopen ładowanie biblioteki?
- 4. Dodawanie biblioteki Boost do projektu C++ w OS X Eclipse
- 5. Hadoop natywne biblioteki nie znaleziono na OS/X
- 6. Wiele myszy na OS X
- 7. Nie można załadować natywnej biblioteki hadoop dla Mac OS X
- 8. Bezpieczeństwo wątków biblioteki standardowej C na OS X
- 9. Błędy Ruby z OS X Yosemite
- 10. Heroku: Uruchamianie imagemagick z spinaczem
- 11. Rozwiązywanie problemów z OS X 10.10
- 12. OS X dzyń -pthread
- 13. Bash OS X: dirname
- 14. Instalowanie h5py na OS X
- 15. assembler w os x
- 16. Maszyna wirtualna z systemem Mac OS X
- 17. przy użyciu PEAR z MAC OS X
- 18. OS X: Git z certyfikatami klienta odrzucone
- 19. Korzystanie z OS X clang_complete Ramki
- 20. problem z git + DiffMerge na OS X
- 21. Jak odinstalować SBT z OS X?
- 22. Konflikt MAMP z OS X Lion Apache
- 23. Jak odinstalować MySQL z Mac OS X?
- 24. Flask ImportError z bsonem na OS X
- 25. JNotify w systemie Mac OS X?
- 26. Zdalne debugowanie XCode aplikacji OS X
- 27. Czy powinienem łączyć biblioteki C z moją aplikacją Python?
- 28. gdzie zmienne biblioteki współużytkowanej przechowywane po połączeniu z aplikacją
- 29. Niepoprawne polecenie systemu OS X
- 30. Katalog lokalny OS X mount
szukam zrobić to samo. Każda pomoc byłaby dobra AFAIK ImageMagick obsługuje tylko bezwzględne ścieżki, więc nie można użyć na przykład tyld w ścieżce do niego. Więc chociaż NSTask działa, byłem tylko jabłkiem, aby umieścić odpowiednie biblioteki ImageMagick w obszarze "/" dowolnego HD, na którym instaluję aplikację. Istnieją interfejsy API MagickWand MagickCore PerlMagick Magick ++, Ale nie byłem jeszcze jabłkiem, aby je rozgryźć! – markhunte
Nie wiedziałem, że NSTask pozwala na zmienne środowiskowe ... Być może uda mi się to zrobić :) Jeśli wymyślę rozwiązanie, opublikuję go tutaj. – Nippysaurus
Jeśli ImageMagick tworzy kostki, jedną z nich może być przekazanie zmiennych środowiskowych DYLD_ *. Jednak znacznie lepiej będzie przebudować pliki binarne i biblioteki ImageMagick w celu obsługi osadzania. Wiem, że zostało to zrobione wcześniej, ale nie mam szczegółów. Google może pomóc, jestem pewien. – bbum