Связать библиотеку ImageMagick с приложением OS X? - PullRequest
7 голосов
/ 23 января 2011

Я занимаюсь разработкой приложения для OS X и хотел бы использовать ImageMagick для манипулирования изображениями.Я заметил, что утилиты CLI ImageMagick требуют некоторых переменных среды для работы.Можно ли связать набор инструментов ImageMagick с моим приложением и использовать их в моем коде?

Ответы [ 2 ]

10 голосов
/ 25 января 2011

Итак, вот мое решение:

Я связал бинарный выпуск OS X с моим проектом и использовал NSTask для вызова двоичных файлов. Вам нужно указать переменные окружения "MAGICK_HOME" и "DYLD_LIBRARY_PATH", чтобы NSTask работал правильно. Вот фрагмент того, что я использую.

Обратите внимание, что этот пример жестко запрограммирован для использования "составной" команды ... и использует жестко закодированные аргументы, но вы можете изменить его на что угодно ... он просто служит подтверждением концепции.

-(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 голосов
/ 23 января 2011

возможно?Да.Многие приложения сделали это, но это может быть утомительно.

NSTask допускает использование пользовательских переменных среды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...