2012-06-17 13 views
15
NSError *error = nil; 
NSURL *url = [NSURL URLWithString:[imageLinks objectAtIndex:0]]; 
NSData *tdata = [NSData dataWithContentsOfURL:url options:NSDataReadingUncached error:&error]; 
if (error) { 
    NSLog(@"%@", [error localizedDescription]); 
}else { 
    // no error, this one is being called within my app 
    NSLog(@"Data loaded successfully"); 
} 
self.pictureView1.image = [UIImage imageWithData:tdata]; 

मैं एक jpeg फ़ाइल है में उपयोग के लिए मान्य है की जांच कैसे करें, मैं पुष्टि कर सकता है कि सामग्री और URL सफलतापूर्वक एकत्र की जाती है, लेकिन जब मैं UIImage में मेरी छवि डेटा रखने का प्रयास मेरे ऐप में विफल रहता है । मुझे आश्चर्य है कि अगर एनएसडीटा की पुष्टि करने के लिए कोई जांच है तो यह UIImage के लिए उपयोग योग्य है।अगर एक NSData UIImage

मुझे यह भी नहीं पता कि इस विफलता का कारण क्या है, और इसे कैसे रोकें। किसी भी सहायता की सराहना की जाएगी।

+0

आप जांच सकते हैं कि स्थिर कन्स्ट्रक्टर UIImage से वापसी मूल्य 'nil' है या नहीं, यह देखने के लिए कि डेटा वास्तव में छवि के रूप में उपयोग किया जा सकता है या नहीं। यह क्यों विफल रहता है, कारण भी अनुमान लगाने के लिए बहुत कम जानकारी है। क्या आप एनएसडीटा प्राप्त करने के लिए लॉग पोस्ट कर सकते हैं? – nhahtdh

+0

छवि डेटा दूषित हो गया है, अगर इसे किसी छवि के रूप में उपयोग किया जा सकता है, तो इसकी जांच कैसे की जा सकती है, और यदि इसका उपयोग क्यों नहीं किया जा सकता है? – Bartu

+0

मुझे लगता है कि मैंने आपकी टिप्पणी में आपके 2 प्रश्नों का उत्तर दिया है। – nhahtdh

उत्तर

23

जैसा कि कहा गया है in the documentation imageWithData: यदि UIImage डेटा से कोई छवि नहीं बना सका तो शून्य वापस आती है। रनटाइम पर इसे संभालने का सही तरीका प्लेसहोल्डर छवि प्रदान करना है जब वह विधि शून्य हो जाती है।

निदान के लिए, पहले कंसोल संदेशों को देखें, वे कभी-कभी उपयोगी जानकारी प्रदान करते हैं। यदि नहीं, तो आपकी सबसे अच्छी किस्मत एनएसडीटा को डिस्क पर डंप करना है और परिणाम को सर्वर पर संग्रहीत फ़ाइल में तुलना करना है। आपको कभी-कभी दूषित डेटा मिलता है, आप कभी-कभी केवल एक HTML त्रुटि संदेश प्राप्त करते हैं जहां आप जेपीईजी बाइनरी डेटा की अपेक्षा कर रहे थे।

-1
if (tdata !=nil){ 
    NSlog(@"Valid"); 
} 

इसे आजमाएं, यह जांच करेगा कि nsdata खाली है या नहीं।

+4

हाँ यह होगा, लेकिन यह सवाल नहीं था। – katzenhut

4

आप

if ([UIImage imageWithData:yourNSData]) { 
    // there was an image 
} 
0

उपयोग कर सकते हैं इस आज़मा कर देखें ...

if ((dataImage != NULL) && ![v isKindOfClass:[NSNull class]]) 
{ 

} 

कुछ भी नहीं है इस के अलावा मेरे मामले में काम किया।

2

स्विफ्ट के लिए यह कोशिश,

if let image = UIImage(data: yourNSData){ 
    YourImageView.image = image 
} 
0

आप एक एकल छोटे छवि के साथ काम कर रहे हैं, तो आप एक UIImage करने के लिए Data परिवर्तित कर सकते हैं:

if let _ = UIImage(data: data) { 
    print("data contains image data") 
} else { 
    print("data does not contain image data") 
} 

लेकिन आप काम कर रहे हैं कई छवियों या उच्च परिभाषा छवियों के साथ, आप सभी फ़ाइलों में The magic bytes कहलाते हैं, यानी फ़ाइल हस्ताक्षर का प्रतिनिधित्व करने वाले पहले कुछ बाइट्स का उपयोग कर सकते हैं।

मूल रूप से आपको केवल एक पूरी छवि आवंटन के बजाय कुछ बाइट निकालना होगा।

आयात फाउंडेशन

extension Data { 
    var isImageData: Bool { 
     let array = self.withUnsafeBytes { 
      [UInt8](UnsafeBufferPointer(start: $0, count: 10)) 
     } 
     let intervals: [[UInt8]] = [ 
      [0x42, 0x4D], // bmp 
      [0xFF, 0xD8, 0xFF], // jpg 
      [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A], // png 
      [0x00, 0x00, 0x00, 0x0C, 0x6A, 0x50, 0x20, 0x20], // jpeg2000 
      [0x49, 0x49, 0x2A, 0x00], // tiff1 
      [0x4D, 0x4D, 0x00, 0x2A] // tiff2 
     ] 

     for interval in intervals { 
      var image = true 
      for i in 0..<interval.count { 
       if array[i] != interval[i] { 
        image = false 
        break 
       } 
      } 
      if image { return true } 
     } 
     return false 
    } 
} 

आपको लगता है कि कोड और फ़ाइल प्रकार (उदाहरण के लिए see Wikipedia list of file signatures) के आधार पर अधिक छवियों को जोड़ या किसी फ़ाइल प्रकार मान्यता कल्पना कर सकते हैं:

यहाँ इस तकनीक का उपयोग कर एक Data विस्तार है।