2011-01-23 3 views
7

OS X 응용 프로그램을 개발 중이며 ImageMagick을 사용하여 이미지 조작을하고 싶습니다. CLI ImageMagick 유틸리티가 작동하려면 몇 가지 환경 변수가 필요합니다. ImageMagick 도구 모음을 내 응용 프로그램과 함께 묶어 내 코드에서 사용할 수 있습니까?OS X 응용 프로그램과 번들 ImageMagick 라이브러리?

답변

10

그래서 여기 내 솔루션입니다. NSTask가 올바르게 작동하려면 "MAGICK_HOME"및 "DYLD_LIBRARY_PATH"환경 변수를 지정해야합니다. 여기에 제가 사용하는 스 니펫이 있습니다.

이 예제는 "합성"명령을 사용하기 위해 하드 코딩되어 있습니다 ... 하드 코딩 된 인수를 사용하지만 원하는대로 변경할 수 있습니다 ... 단지 개념 증명입니다.

-(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]; 
} 

이 솔루션은 출시 (순간 37메가바이트)와 전체 라이브러리의 대부분을 번들, 그래서 몇 가지 솔루션에 이상적 차이가있을 수 있지만, 내가 찾고 있어요

2

가능한가? 예. 많은 앱이 그렇게했으나 지루할 수 있습니다.

NSTask는 사용자 지정 환경 변수를 허용합니다.

내가 내 프로젝트와 OS X binary 버전을 번들로 제공하고, 바이너리를 호출하는 NSTask를 사용 :

+0

:-) 노력하고 있습니다 같은 일을하는 것. 도움이 될 것입니다. AFAIK ImageMagick은 절대 경로 만 지원하므로 경로에 tild를 사용할 수 없습니다. 그래서 NSTask는 작동하지만 애플을 설치 한 모든 HD의 "/"영역에 호환되는 ImageMagick 라이브러리를 넣으려고 애썼다. API가 있습니다 MagickWand MagickCore PerlMagick Magick ++,하지만 사과를 아직 못 알아 냈습니다! – markhunte

+0

NSTask가 환경 변수를 허용한다는 것을 알지 못했습니다 ... 나는이 작업을 할 수있을 것입니다 :) 해결책을 찾으면 여기에 게시 할 것입니다. – Nippysaurus

+1

ImageMagick이 dylib를 빌드하는 경우, DYLD_ * 환경 변수를 전달하는 트릭이있을 수 있습니다. 그러나 임베디드를 지원하기 위해 ImageMagick 바이너리와 라이브러리를 재구성하는 것이 훨씬 낫습니다. 나는 그것이 전에 행해졌다는 것을 알고있다. 그러나 나는 세부를 가지지 않고있다. Google이 도울 수 있다고 확신합니다. – bbum

관련 문제