2009-08-24 15 views
27

मेरी कोको आवेदन में, मैं डिस्क से एक .jpg फ़ाइल लोड, यह हेरफेर। अब इसे एक .png फ़ाइल के रूप में डिस्क पर लिखा जाना चाहिए। आप ऐसा कैसे कर सकते हैं?CGImageRef को एक पीएनजी फ़ाइल में सहेज रहा है?

आपकी मदद के लिए धन्यवाद!

उत्तर

13

एक CGImageDestination बनाएँ, kUTTypePNG फ़ाइल के प्रकार बनाने के लिए के रूप में गुजर। छवि जोड़ें, फिर गंतव्य को अंतिम रूप दें।

+0

ivanceras: http://developer.apple.com/mac/library/documentation/GraphicsImaging/Reference/CGImageDestination/ यदि आप चाहते हैं एक और विशिष्ट उत्तर, आपको एक और विशिष्ट प्रश्न पूछना चाहिए (और आपको एक अलग प्रश्न के रूप में ऐसा करना चाहिए)। –

+0

बस एक नोट। हम 'कार्यों भी प्रलेखन कह रहा है यह' ApplicationServices/ImageIO' पर है को संदर्भित करने के ImageIO.framework' जोड़ने के लिए। – Eonil

+1

@Eonil: यह जो मंच आप के लिए निर्माण कर रहे हैं पर निर्भर करता है। कोको टच में छतरी ढांचे नहीं होते हैं, इसलिए आईओएस के लिए निर्माण करते समय, आपको सीधे छवियों के खिलाफ लिंक करने की आवश्यकता होती है। मैक ओएस एक्स के लिए निर्माण करते समय, आप एप्लिकेशन सर्विसेज के खिलाफ लिंक करते हैं और इसके भीतर सब कुछ प्राप्त करते हैं। –

89

CGImageDestination का उपयोग करना और गुजर kUTTypePNG सही दृष्टिकोण है।

@import MobileCoreServices; // or `@import CoreServices;` on Mac 
@import ImageIO; 

BOOL CGImageWriteToFile(CGImageRef image, NSString *path) { 
    CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:path]; 
    CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypePNG, 1, NULL); 
    if (!destination) { 
     NSLog(@"Failed to create CGImageDestination for %@", path); 
     return NO; 
    } 

    CGImageDestinationAddImage(destination, image, nil); 

    if (!CGImageDestinationFinalize(destination)) { 
     NSLog(@"Failed to write image to %@", path); 
     CFRelease(destination); 
     return NO; 
    } 

    CFRelease(destination); 
    return YES; 
} 

आप अपने प्रोजेक्ट के लिए (आईओएस पर या MobileCoreServices) ImageIO और CoreServices जोड़ने के लिए और शीर्ष लेख शामिल की आवश्यकता होगी: यहां एक त्वरित टुकड़ा है।


आप iOS पर कर रहे हैं और एक समाधान है कि मैक पर भी काम करता है की जरूरत नहीं है, तो आप एक सरल दृष्टिकोण का उपयोग कर सकते हैं:

// `image` is a CGImageRef 
// `path` is a NSString with the path to where you want to save it 
[UIImagePNGRepresentation([UIImage imageWithCGImage:image]) writeToFile:path atomically:YES]; 

मेरी परीक्षणों में ImageIO दृष्टिकोण के बारे में था मेरे आईफोन 5 एस पर UIImage दृष्टिकोण से 10% तेज। सिम्युलेटर में, यूआईएममेज दृष्टिकोण तेज था। यदि आप वास्तव में प्रदर्शन से चिंतित हैं तो डिवाइस पर आपकी विशेष स्थिति के लिए प्रत्येक का परीक्षण करना उचित है।

+0

आप किसी भी जानकारी इनमें से जिस पर अधिक कुशल है है? धन्यवाद। –

+0

प्रदर्शन जानकारी के साथ मेरा जवाब अपडेट किया गया :) –

16

यहाँ एक MacOS के अनुकूल है, स्विफ्ट है 3 & 4 उदाहरण:

@discardableResult func writeCGImage(_ image: CGImage, to destinationURL: URL) -> Bool { 
    guard let destination = CGImageDestinationCreateWithURL(destinationURL as CFURL, kUTTypePNG, 1, nil) else { return false } 
    CGImageDestinationAddImage(destination, image, nil) 
    return CGImageDestinationFinalize(destination) 
} 
संबंधित मुद्दे