2011-01-07 13 views
91

से अंतर्निहित NSData * प्राप्त करें मैं [UIImage imageWithdata:] या [UIImage initWithData] विधि का उपयोग करके एनएसडीटा से UIImage बना सकता हूं।UIImage

मुझे आश्चर्य है कि क्या मैं एनएसडीएटा * को मौजूदा यूआईएममेज * से वापस प्राप्त कर सकता हूं?
NSData* myData = [myImage getData];

क्या यह असंभव है?
आप

उत्तर

173
NSData *imageData = UIImageJPEGRepresentation(image, 0.7); // 0.7 is JPG quality 

या

NSData *imageData = UIImagePNGRepresentation(image); 

आधार पर आप PNG प्रारूप या JPG प्रारूप में अपने डेटा चाहते हैं धन्यवाद।

+62

मुझे नहीं पता कि यह जवाब इतनी बार क्यों मतदान किया गया है और न ही यह स्वीकार किया जाता है। ओपी ने शुरू में दिया गया डेटा पुनर्प्राप्त करने के लिए कहा।'UIImageJPEGReresentation' या' UIImagePNGRresentation' ** का उपयोग करके ** ** डेटा बदल देगा और एक पुनरावृत्ति करेगा। क्या वास्तव में प्राप्त करने का कोई तरीका है जिसके लिए पूछा गया था? – CipherCom

+5

यह उत्तर अच्छा नहीं है, क्योंकि यह छवि की गुणवत्ता को कम करेगा यदि यह पहले से ही हानिकारक प्रारूप में है। – 1dayitwillmake

+0

@CipherCom मैं देखता हूं कि आप सटीक डेटा को वापस लाने के बारे में क्या कह रहे हैं। हालांकि, मुझे लगता है कि अधिकांश लोगों के लिए सवाल उठता है, यह जवाब उनकी जरूरतों के लिए सही होगा ... इसलिए उपरोक्त। यदि आप मूल डेटा वापस पाने के उत्तर में आते हैं, तो कृपया साझा करें;) – tybro0103

-2

हालात बदल गए हैं के बाद से ऊपर जवाब दिया गया था, अभी भी देख रहा है क्योंकि वे CipherCom की चिंता का हिस्सा उन लोगों के लिए: iOS 5 में CIImage property जोड़ा गया है।

+0

मैं अंतर्निहित NSData प्राप्त करने के लिए सीआईएममेज का उपयोग करने का कोई तरीका नहीं देख रहा हूं ... क्या मुझे कुछ याद आ रही है? – tybro0103

+4

इससे मदद नहीं मिलेगी। संपत्ति '' CIImage'' केवल तभी सेट की गई है जब इसे 'imageWithCIImage:' 'के साथ प्रारंभ किया गया था। यह भी सीधे इस्तेमाल डेटा नहीं बल्कि एक और छवि प्रतिनिधित्व वस्तु है। – CipherCom

3

सिर्फ इसलिए कि मैं इस पर ठोकर खाई और मैं तेजी से चाहते :)

यहाँ Caroiline पद की तेज अनुवाद है।

var imageData = UIImagePNGRepresentation(image) 

या

var imageData = UIImageJPEGRepresentation(image, 0.7) 
+0

प्रश्न तेजी से नहीं था। –

4

आप उम्मीद कर सकते हैं कि एक UIImage एक वस्तु प्रदर्शित करने के लिए स्वरूपित है और इसलिए मूल डेटा का उपयोग नहीं किया जाएगा (जो शायद PNG या JPEG प्रारूप में है), लेकिन अधिक होने की संभावना एक पिक्सेल सरणी या कुछ अन्य आंतरिक प्रारूप। दूसरे शब्दों में, UIImage(data: foo)foo बनाए रखेगा।

  1. तुम सिर्फ अपने कार्यक्रम में कहीं और इसका उपयोग करना चाहते हैं, तो मूल UIImage ठीक करना होगा (मुझे लगता है कि वास्तव में यहां ऐसा नहीं है)

  2. आप serialise चाहते हैं, UIImagePNGRepresentation(...) कार्य करेगी, लेकिन यदि मूल एक जेपीईजी था तो oversized किया जाएगा; UIImageJPEGRepresentation(...) अक्सर थोड़ा ओवरसाइज डेटा का परिणाम देगा और यदि आपका मूल पीएनजी था तो थोड़ा हानिकारक होगा। छवि को प्रदर्शित करने के तरीके और जिस प्रारूप को आप प्रदान करने की अपेक्षा करते हैं उसके आधार पर एक को चुनना ठीक होना चाहिए। यदि आप पीएनजी का उपयोग करते हैं और पीएनजी चाहते हैं, तो आपको एक अच्छा फ़ाइल आकार और लगभग समान डेटा, विशेष पीएनजी भाग अलग-अलग प्राप्त करना चाहिए।

  3. यदि आप मूल डेटा की एक सटीक प्रति प्राप्त करना चाहते हैं (शायद थंबनेलिंग के बाद फ़ाइल को सहेजने के लिए, या SHA1 के लिए), तो आपको इसे अलग से बनाए रखना होगा। जब init(data: originalData) के साथ एक UIImage वस्तु initialising

    var image:UIImage 
    var imageData:NSData { 
        didSet { 
         image = UIImage(data: imageData) 
        } 
    } 
    
0

, कि originalData आंतरिक प्रारूप के कुछ प्रकार में कच्चे डेटा में बदल दिया जाएगा: आप की तरह कुछ कर सकता है। इन आंकड़ों से बाद में

let rawData = myImage.cgImage?.dataProvider?.data as Data? 

हालांकि क्योंकि rawData कच्चे है, यह जब UIImagePNGRepresentation का उपयोग कर से भी बड़ा होने जा रहा है के साथ प्राप्त किया जा सकता है।