UIImage को NSData में बदलें


170

मैं अपने कोड में इस कोड का उपयोग कर रहा हूं जो मुझे एक छवि भेजने में मदद करेगा।

हालाँकि, मेरे पास छवि के साथ एक छवि है। मेरे पास कोई फ़ाइल नहीं है, लेकिन मेरे पक्ष में छवि है। मैं नीचे दिए गए कोड को कैसे बदल सकता हूं? किसी को भी मुझे बता सकते हैं कि कैसे मैं परिवर्तित कर सकते हैं myimageकरने के लिए NSData?

// Attach an image to the email
NSString *path = [[NSBundle mainBundle] pathForResource:@"rainy" ofType:@"jpg"];
NSData *myData = [NSData dataWithContentsOfFile:path];
[picker addAttachmentData:myData mimeType:@"image/jpeg" fileName:@"rainy"];

2
UIImageJPEGRepresentation, UIImagePNGRepresentation दोनों छवि के nsdata .....
हिमांशु अग्निहोत्री

जवाबों:


286

अपने छवि प्रारूप के आधार पर निम्न में से कोई एक आज़माएँ:

UIImageJPEGRepresentation

JPEG प्रारूप में निर्दिष्ट छवि के लिए डेटा लौटाता है।

NSData * UIImageJPEGRepresentation (
   UIImage *image,
   CGFloat compressionQuality
);

UIImagePNGRepresentation

पीएनजी प्रारूप में निर्दिष्ट छवि के लिए डेटा लौटाता है

NSData * UIImagePNGRepresentation (
   UIImage *image
);

यहाँ डॉक्स

संपादित करें:

यदि आप UIImage बनाने वाली कच्ची बाइट्स का उपयोग करना चाहते हैं, तो आप इस दृष्टिकोण का उपयोग कर सकते हैं:

CGDataProviderRef provider = CGImageGetDataProvider(image.CGImage);
NSData* data = (id)CFBridgingRelease(CGDataProviderCopyData(provider));
const uint8_t* bytes = [data bytes];

यह आपको छवि RGB पिक्सल का निम्न-स्तरीय प्रतिनिधित्व देगा। ( CFBridgingReleaseयदि आप एआरसी का उपयोग नहीं कर रहे हैं तो बिट को छोड़ें)।


8
क्या पहले से ही जो भी प्रारूप में है उसे डेटा प्राप्त करने का एक तरीका है?
devios1

1
एक्सकोड ने मुझे एआरसी में रिटर्न (id)CFBridgingRelease(CGDataProviderCopyData(provider))के स्वामित्व को लेने के लिए उपयोग करने का सुझाव दिया । CDataRefCGDataProviderCopyData
जनाब

1
@ASTruash: धन्यवाद, मैंने आपके सुझाव को ध्यान में रखते हुए अपना उत्तर संशोधित किया है।
सर्जियो

@sergio मैं गैर-एआरसी ओब्ज-सी के साथ अनुभव नहीं कर रहा हूं और मुझे आश्चर्य है कि अगर रिलीज़ dataकरना पर्याप्त होगा या यदि अभी भी कोई स्मृति रिसाव होगा।
15

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

161
NSData *imageData = UIImagePNGRepresentation(myImage.image);

4
मैं इस लाइन का उपयोग कर रहा हूं लेकिन यह बहुत धीमा है
user2128531

5
ध्यान दें कि UIImagePNGRepresentation का उपयोग करते समय ImageFlags (जैसे ImageOrientation) खो जाते हैं। इसीलिए UIImageJPEGRepresentation को प्राथमिकता दी जाती है।
योनी

26

यदि आपकी छवि UIImageView के अंदर है, उदाहरण के लिए "myImageView", तो आप निम्न कार्य कर सकते हैं:

UIImageJPEGRepresentation () या UIImagePNGRepresentation () का उपयोग करके अपनी छवि परिवर्तित करें:

NSData *data = UIImagePNGRepresentation(myImageView.image);
//or
NSData *data = UIImageJPEGRepresentation(myImageView.image, 0.8);
//The float param (0.8 in this example) is the compression quality 
//expressed as a value from 0.0 to 1.0, where 1.0 represents 
//the least compression (or best quality).

आप इस कोड को एक GCD ब्लॉक के अंदर भी डाल सकते हैं और एक अन्य थ्रेड में निष्पादित कर सकते हैं, जो इस दौरान एक UIActivityIndicatorView दिखा रहा है ...

//*code to show a loading view here*

dispatch_queue_t myQueue = dispatch_queue_create("com.my.queue", DISPATCH_QUEUE_SERIAL);

dispatch_async(myQueue, ^{ 

    NSData *data = UIImagePNGRepresentation(myImageView.image);
    //some code....

    dispatch_async( dispatch_get_main_queue(), ^{
        //*code to hide the loading view here*
    });
});

24

छवि का संदर्भ बनाएं ...।

UIImage *rainyImage = [UIImage imageNamed:@"rainy.jpg"];

छवि दृश्य में छवि प्रदर्शित करना ... imagedisplay छवि दृश्य का संदर्भ है:

imagedisplay.image = rainyImage;

यह में तब्दील NSDataपास करके UIImageसंदर्भ और नाव मूल्यों में संपीड़न गुणवत्ता प्रदान करते हैं:

NSData *imgData = UIImageJPEGRepresentation(rainyImage, 0.9);

2

स्विफ्ट 4 में समाधान

extension UIImage {
    var data : Data? {
      return cgImage?.dataProvider?.data as Data?
    }
}

cgImage.dataProviderडेटा एन्कोडेड कैसे है ? यह डेटा से भिन्न प्रतीत होता है UIImagePNGRepresentationऔर UIImageJPEGRepresentationक्योंकि इसका उपयोग किसी चित्र को बनाने के लिए नहीं किया जा सकता है UIImage(data: imageData)
मैनुएल

@ मैनुअल यकीन नहीं है। मैंने सिर्फ वाक्य रचना को सर्जियो के उत्तर से बदल दिया। सर्जियो शायद बेहतर जानते होंगे।
चार्लटन प्रोवाटास

@ मैनुअल मैं मान रहा हूं क्योंकि यह CoreGraphics API का उपयोग कर रहा है, यह छवि के निचले स्तर के डेटा प्रतिनिधित्व को UIImageJPEGRepresentationप्रदान करता है जो प्रदान करता है। लेकिन मेरा मानना ​​है कि यह समाधान मूल एन्कोडिंग प्रारूप को संरक्षित करता है जो छवि में था और इसे फिर से एनकोड नहीं करता है।
चार्लटन प्रोवाटास

1

एप्लिकेशन क्रैश और कोड के सुरक्षित निष्पादन को रोकने के लिए डेटा के साथ ब्लॉक-चलो का उपयोग करें, क्योंकि फ़ंक्शन UIImagePNGRepresentation एक वैकल्पिक मान लौटाता है।

if let img = UIImage(named: "TestImage.png") {
    if let data:Data = UIImagePNGRepresentation(img) {
       // Handle operations with data here...         
    }
}

नोट: डेटा स्विफ्ट 3 वर्ग है। NSData के बजाय Swift 3 के साथ डेटा का उपयोग करें

सामान्य छवि संचालन (जैसे png और jpg दोनों):

if let img = UIImage(named: "TestImage.png") {  //UIImage(named: "TestImage.jpg")
        if let data:Data = UIImagePNGRepresentation(img) {
               handleOperationWithData(data: data)     
        } else if let data:Data = UIImageJPEGRepresentation(img, 1.0) {
               handleOperationWithData(data: data)     
        }
}

*******
func handleOperationWithData(data: Data) {
     // Handle operations with data here...
     if let image = UIImage(data: data) {
        // Use image...
     }
}

एक्सटेंशन का उपयोग करके:

extension UIImage {

    var pngRepresentationData: Data? {
        return UIImagePNGRepresentation(img)
    }

    var jpegRepresentationData: Data? {
        return UIImageJPEGRepresentation(self, 1.0)
    }
}

*******
if let img = UIImage(named: "TestImage.png") {  //UIImage(named: "TestImage.jpg")
      if let data = img.pngRepresentationData {
              handleOperationWithData(data: data)     
      } else if let data = img.jpegRepresentationData {
              handleOperationWithData(data: data)     
     }
}

*******
func handleOperationWithData(data: Data) {
     // Handle operations with data here...
     if let image = UIImage(data: data) {
        // Use image...
     }
}

0
- (void) imageConvert
{
     UIImage *snapshot = self.myImageView.image;
     [self encodeImageToBase64String:snapshot];
}    


call this method for image convert in base 64 
    -(NSString *)encodeImageToBase64String:(UIImage *)image
    {
        return [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.