UIImage से अंतर्निहित NSData प्राप्त करें


104

मैं उपयोग या विधियों UIImageसे बना सकता हूं । NSData[UIImage imageWithData:][UIImage initWithData:]

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

जवाबों:


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

या

NSData *imageData = UIImagePNGRepresentation(image);

निर्भर करता है कि आप अपना डेटा पीएनजी फॉर्मेट या जेपीजी फॉर्मेट में चाहते हैं।


82
मुझे नहीं पता कि यह जवाब इतनी बार क्यों दिया जाता है और न ही इसे स्वीकार किया जाता है। ओपी ने शुरू में दिए गए डेटा को पुनः प्राप्त करने के लिए कहा। का उपयोग करना UIImageJPEGRepresentationया डेटा UIImagePNGRepresentation को बदल देगा और एक पुनर्निर्माण करेगा। क्या वास्तव में हासिल करने के लिए कोई रास्ता है?
पैट्रिक

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

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

@ 1dayitwillmake यहां तक ​​कि PNG प्रतिनिधि? मेरी विशेषज्ञता का क्षेत्र नहीं है, लेकिन मुझे लगा कि PNG को नुकसान नहीं होता है?
tybro0103

@ थूक का छींटा यह मदद नहीं करेगा। संपत्ति CIImage केवल तभी सेट की जाती है यदि इसे ImageWithCIImage: के साथ आरंभ किया गया था। इसके अलावा यह सीधे इस्तेमाल किए गए डेटा नहीं है, बल्कि एक अन्य छवि प्रतिनिधित्व वस्तु है।
राजा-जादूगर

21

जब किसी UIImageऑब्जेक्ट को इनिशियलाइज़ किया जाता है init(data: originalData), तो originalDataउसे किसी प्रकार के आंतरिक प्रारूप में कच्चे डेटा में बदल दिया जाएगा। इन आंकड़ों को बाद में प्राप्त किया जा सकता है

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

हालाँकि क्योंकि rawDataयह कच्चा है, इसलिए उपयोग करने पर यह और भी बड़ा होने वाला है UIImagePNGRepresentation


मैं ऑब्जेक्टिव-सी
h3dkandi

NSData * rawData = (__bridge NSData *) CGDataProviderCopyData (CGImageGetDataProvider (image.CGImage));
ZardozSpeaks

@ZardozSpeaks इस उत्तर में संपादित के रूप में शामिल किए जाने के लिए पूरी तरह से व्यवहार्य obj-c संस्करण है।
कामिल।

6

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

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

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

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

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

4

सिर्फ इसलिए कि मैं इस पर अड़ गया और मुझे तेज पसंद है :)

यहां कैरोलिन की पोस्ट का तेज अनुवाद है।

var imageData = UIImagePNGRepresentation(image)

या

var imageData = UIImageJPEGRepresentation(image, 0.7) 

सवाल स्विफ्ट का नहीं था।
क्रॉस_

3

स्विफ्ट 4.2

let dataPng = image.pngData() // return image as PNG. May return nil if image has no CGImageRef or invalid bitmap format

let dataJpg = image.jpegData(compressionQuality: 1) // return image as JPEG. May return nil if image has no CGImageRef or invalid bitmap format. compression is 0(most)..1(least)

-2

उपरोक्त उत्तर दिए जाने के बाद से चीजें बदल गई हैं, क्योंकि वे अभी भी तलाश कर रहे हैं क्योंकि वे CipherCom की चिंता को साझा करते हैं: iOS 5 ने CIIPage संपत्ति को जोड़ा है ।


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

4
यह मदद नहीं करेगा। संपत्ति CIImageकेवल तभी सेट की जाती है जब इसके साथ आरंभ किया गया हो imageWithCIImage:। इसके अलावा यह सीधे इस्तेमाल किए गए डेटा नहीं है, बल्कि एक अन्य छवि प्रतिनिधित्व वस्तु है।
पैट्रिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.