2011-01-23 10 views
7

मैं एक ओएस एक्स अनुप्रयोग विकसित कर रहा हूं, और कुछ छवि मैनिपुलेशन करने के लिए ImageMagick का उपयोग करना चाहता हूं। मैंने देखा है कि सीएलआई ImageMagick उपयोगिताओं को काम करने के लिए कुछ पर्यावरण चर की आवश्यकता है। क्या मेरे एप्लिकेशन के साथ इमेजमैजिक सूट टूल्स को बंडल करना संभव है और उन्हें मेरे कोड में इस्तेमाल करना संभव है?ओएस एक्स ऐप के साथ बंडल ImageMagick लाइब्रेरी?

उत्तर

10

तो यहाँ मेरी समाधान है। एनएसटीस्क के लिए सही तरीके से काम करने के लिए आपको "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]; 
} 

यह समाधान अपने रिलीज (पल में 37MB) के साथ पूरी लाइब्रेरी के थोक बंडल, तो यह कुछ समाधान के लिए आदर्श की तुलना में कम हो सकता है, लेकिन यह :-)

2

संभव है? हाँ। कई ऐप्स ने ऐसा किया है, लेकिन यह थकाऊ हो सकता है।

एनएसटीस्क कस्टम पर्यावरण चर के लिए अनुमति देता है।

मैं अपने प्रोजेक्ट के साथ OS X binary रिहाई बंडल, और एक NSTask इस्तेमाल किया बाइनरी कॉल करने के लिए:

+0

काम कर रहा है मैं देख रहा हूँ एक ही काम करने के लिए। कोई मदद अच्छी होगी AFAIK ImageMagick केवल पूर्ण पथ का समर्थन करता है, इसलिए आप इसके पथ में उदाहरण के लिए उपयोग नहीं कर सकते हैं। तो हालांकि एनएसटीस्क काम करता है, मैं केवल ऐप्पल रहा हूं कि किसी भी एचडी के "/" क्षेत्र में अनुपालन ImageMagick पुस्तकालयों को ऐप इंस्टॉल करें। एपीआई मैगिकंड मैजिककोर पर्लमैजिक मैजिक ++, लेकिन मैं अभी तक उन्हें बाहर निकालने के लिए सेब नहीं रहा हूं! – markhunte

+0

मुझे नहीं पता था कि एनएसटीस्क ने पर्यावरण चर के लिए अनुमति दी है ... मैं यह काम करने में सक्षम हो सकता हूं :) अगर मुझे कोई समाधान पता है तो मैं इसे यहां पोस्ट करूंगा। – Nippysaurus

+1

यदि ImageMagick dylibs बनाता है, तो एक चाल DYLD_ * पर्यावरण चर को पारित करने के लिए हो सकती है। हालांकि, आप एम्बेडिंग का समर्थन करने के लिए ImageMagick बाइनरी और पुस्तकालयों का पुनर्निर्माण बंद करना बेहतर होगा। मुझे पता है कि यह पहले किया गया है, लेकिन मेरे पास विवरण नहीं है। Google मदद कर सकता है, मुझे यकीन है। – bbum

संबंधित मुद्दे