2010-08-21 11 views
5

मुझे एक CGContextDrawImage कॉल में EXEC_BAD_ACCESS त्रुटियां मिल रही हैं और इसे वापस ढूंढने का प्रयास कर रही हैं। मेरे पास एक पीएनजी छवि है और UIImagePNGRepresentation चला रहा है o यह मुझे NSData उदाहरण देता है।आईएसडी एसडीके पर NSData को CGDataProviderRef में कैसे परिवर्तित करें?

मुझे इसे CGImageRef उदाहरण में कनवर्ट करने की आवश्यकता है, इसलिए मैं CGImageCreateWithPNGDataProvider विधि को इस CGImageRef के साथ चला सकता हूं।

मैंने दो तरीकों की कोशिश की: 1) इसे कास्ट करने के लिए।

CGImageRef ref = (CGDataProvider) nsdata;

2) CGDataProviderCreateWithCFData (nsdata) चलाने के लिए;

पहला मामला खाली छवि देता है, हालांकि कमांड विफल नहीं होता है। कारण मैंने दूसरे मामले की कोशिश की, भले ही मेरे पास NSData है और CFData नहीं है क्योंकि मुझे याद है कि यह दोनों को स्वीकार करता है। जो भी कारण हो, यह इस वजह से विफल रहा है।

क्या कोई तरीका है कि मैं एक CGImage बनाने के लिए अपने पीएनजी एनएसडेटा का उपयोग कर सकता हूं जो दूषित नहीं है? कृपया मदद करें।

थैंक्स

उत्तर

3

पहला बहुत गलत है। आप इंस्टेंस को CGImageRef में इसे कास्ट करके नहीं बदल सकते हैं।

दूसरे को ठीक काम करना चाहिए। आपको NSData उदाहरण CFDataRef पर डालना होगा, लेकिन ऐप्पल टोल-फ्री ब्रिजिंग पर कॉल करने के कारण यह पूरी तरह कानूनी है।

यहाँ एक और और बहुत आसान विधि है:

NSData* data = ... get raw image data from somewhere (PNG, JPEG, etc.) ...; 
UIImage* image = [UIImage imageWithData: data]; 
CGImageRef imageRef = image.CGImage; 

मैं छवियों को लोड करने के लिए उच्च स्तर UIImage तरीकों का उपयोग करने के लिए और फिर निचले स्तर कोर ग्राफिक्स कार्यों के लिए image.CGImage का उपयोग पसंद करते हैं। यदि आपको इसे चारों ओर रखने की आवश्यकता है तो UIImage को ठीक से बनाए रखना न भूलें।

+0

'image.CGImage' निश्चित रूप से की तुलना में' (CGImageRef) [(आईडी) CGImageCreateWithPNGDataProvider ((CGDataProviderRef) [(आईडी) CGDataProviderCreateWithNSData ((CFDataRef) UIImagePNGRepresentation (छवि)) autorelease बेहतर है ], 0,0,0) autorelease] ' –

+1

ध्यान दें कि UIKit थ्रेड-सुरक्षित नहीं है, इसलिए पृष्ठभूमि धागे पर 'UIImage' उदाहरण बनाना समस्याएं पैदा कर सकता है। कुछ मामलों में सीधे 'CGImageRef' बनाना बेहतर होता है। ऐप्पल के प्रलेखन (https://developer.apple.com/reference/uikit/uiimage) के अनुसार – cheeesus

+0

@cheeesus, पृष्ठभूमि धागे में UIImage उदाहरण बनाने के लिए सुरक्षित है: * "छवि वस्तुओं की अपरिवर्तनीय प्रकृति का भी अर्थ है कि वे हैं किसी भी धागे से बनाने और उपयोग करने के लिए सुरक्षित। "* – Arda

9

आपकी दूसरी कोशिश लगभग सही है। सीएफडीटा और एनएसडीटा "टोल-फ्री ब्रिज" हैं। कोई भी जो CFDataRef स्वीकार करता है वह भी NSData (और इसके विपरीत) स्वीकार करता है - आपको बस सही ढंग से डालना होगा।

आप की जरूरत है:

CGDataProviderCreateWithCFData((CFDataRef)myNSData); 
+2

यदि आपके पास एआरसी है, तो सीधे कनवर्ट करने के लिए __bridge का उपयोग करें: CGDataProviderCreateWithCFData ((__ ब्रिज CFDataRef) myNSData); – situee

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