2011-01-23 12 views
7

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

10

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 :-)

2

Możliwe? Tak. Wiele aplikacji tak zrobiło, ale może być uciążliwe.

NSTask pozwala na niestandardowe zmienne środowiskowe.

+0

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

+0

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

+1

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