2011-01-23 11 views
7

Estoy desarrollando una aplicación OS X y me gustaría usar ImageMagick para manipular la imagen. Me he dado cuenta de que las utilidades CLI ImageMagick requieren algunas variables de entorno para funcionar. ¿Es posible agrupar el conjunto de herramientas de ImageMagick con mi aplicación y usarlas en mi código?Paquete de la biblioteca ImageMagick con la aplicación OS X?

Respuesta

10

Así que aquí está mi solución:

me lían la liberación OS X binary con mi proyecto, y utilizaron un NSTask llamar a los binarios. Debe especificar las variables de entorno "MAGICK_HOME" y "DYLD_LIBRARY_PATH" para que NSTask funcione correctamente. Aquí hay un fragmento de lo que estoy usando.

Tenga en cuenta que este ejemplo está codificado para usar el comando "compuesto" ... y usa argumentos codificados, pero puede cambiarlo a lo que quiera ... solo sirve como una prueba de concepto.

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

Esta solución lía la mayor parte de toda la biblioteca con su liberación (37MB por el momento), por lo que podría ser menos que ideal para algunas soluciones, pero está trabajando :-)

2

¿Posible? Sí. Muchas aplicaciones lo han hecho, pero puede ser tedioso.

NSTask permite variables de entorno personalizadas.

+0

Busco para hacer lo mismo Cualquier ayuda sería buena AFAIK ImageMagick solo admite rutas absolutas, por lo que no puede usar, por ejemplo, tilds en la ruta de acceso a ella. Entonces, aunque NSTask funciona, solo he sido útil para colocar las bibliotecas compiladas de ImageMagick en el área "/" de cualquier HD en el que instale la aplicación. Hay APIs MagickWand MagickCore PerlMagick Magick ++, ¡Pero todavía no he aprendido a descifrarlas! – markhunte

+0

No sabía que NSTask permitía variables de entorno ... Podría hacer que esto funcione :) Si encuentro una solución, la publicaré aquí. – Nippysaurus

+1

Si ImageMagick construye dylibs, un truco podría ser pasar las variables de entorno DYLD_ *. Sin embargo, sería mucho mejor reconstruir los binarios y las bibliotecas de ImageMagick para admitir la incrustación. Sé que ya se ha hecho antes, pero no tengo detalles. Google puede ayudar, estoy seguro. – bbum

Cuestiones relacionadas