2011-01-23 12 views
7

私はOS Xアプリケーションを開発しており、ImageMagickを使用して画像操作をしたいと考えています。私は、CLI ImageMagickユーティリティが動作するためにいくつかの環境変数を必要としていることに気付きました。 ImageMagickツールスイートをアプリケーションにバンドルして、自分のコードで使用することは可能ですか?OS X AppをバンドルしたImageMagickライブラリ?

答えて

10

は私のソリューションです:

私は私のプロジェクトでOS X binaryリリースを同梱し、バイナリを呼び出すためにNSTaskを使用しました。 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では、カスタム環境変数を使用できます。だからここ

+0

:-)取り組んでいます同じことをする。 AFAIK ImageMagickは絶対パスのみをサポートしているので、パスへのパスにはティルドなどを使うことはできません。だからNSTaskは動作しますが、アプリケーションをインストールするHDの "/"領域に、遵守したImageMagickライブラリを置くためだけにリンゴを使用しています。 APIがありますMagickWand MagickCore PerlMagick Magick ++、しかし私は彼らをまだ理解していません! – markhunte

+0

私は、NSTaskが環境変数に許されていることを知りませんでした...私はこの仕事をすることができるかもしれません:)解決策を見つけたら、ここに投稿します。 – Nippysaurus

+1

ImageMagickがdylibを構築する場合、DYLD_ *環境変数を渡すことが1つのトリックかもしれません。しかし、埋め込みをサポートするためにImageMagickバイナリとライブラリを再構築するほうがはるかに良いでしょう。私はそれが以前に行われたことを知っていますが、私は詳細を持っていません。 Googleが助けることができる、私は確信しています。 – bbum

関連する問題