2010-07-29 8 views
5

मैं एक uiimage से छवि डेटा पुनर्प्राप्त करने, इसे संशोधित करने, और इससे एक नया UIui बनाने का प्रयास कर रहा हूं। शुरू करने के लिए, मैंने बस मूलभूत जानकारी प्राप्त करने के लिए किसी भी संशोधन के बिना डेटा की प्रतिलिपि बनाने की कोशिश की - लेकिन यह विफल रहता है (UIImage +imageWithData: शून्य देता है)। क्या कोई देख सकता है कि यह क्यों काम नहीं करेगा?छवि का उपयोग करके किसी अन्य यूआईएममेज से यूआईएममेज बनाना, विथडाटा रिटर्न शून्य

// I've confirmed that the follow line works 

UIImage *image = [UIImage imageNamed:@"image_foo.png"]; 

// Get a reference to the data, appears to work 

CFDataRef dataRef = CGDataProviderCopyData(CGImageGetDataProvider([image CGImage])); 

// Get the length of memory to allocate, seems to work (e.g. 190000) 

int length = CFDataGetLength(dataRef) * sizeof(UInt8); 

UInt8 * buff = malloc(length); 

// Again, appears to work 

CFDataGetBytes(dataRef, CFRangeMake(0,length),buff); 

// Again, appears to work 

NSData * newData = [NSData dataWithBytesNoCopy:buff length:length]; 

// This fails by returning nil 

UIImage *image2 = [UIImage imageWithData:newData]; 

नोट:

मैं भी उपयोग करने की कोशिश:

UInt8 * डेटा = CFDataGetBytePtr (dataRef);

और बस सीधे एनएसडीटा में पाइपिंग।

वही परिणाम।

+1

क्यों DataWithBytesNoCopy? – jsicary

+0

डेटाविथबाइट्सको कॉपी का उपयोग किया गया क्योंकि उसने बफर को मॉलोक का उपयोग करके आवंटित किया था। इस तरह के ऑब्जेक्ट के पूरे जीवनकाल के दौरान उसे छवि 2 के वास्तविक छवि-बफर तक पहुंच होगी। – Till

उत्तर

1

मेरा मानना ​​है कि imageWithData छवि-फ़ाइल-डेटा लेता है, छवि-प्रदर्शन-डेटा नहीं, जो आप इसे पारित कर रहे हैं। कुछ इस तरह का प्रयास करें:

NSData * newData = UIImageJPEGRepresentation(image, 1.0); 
UIImage *image2 = [UIImage imageWithData:newData]; 

UIImageJPegRepresentation() डेटा है कि आप एक फ़ाइल पर लिखने डिस्क पर एक .jpg फ़ाइल बनाने के लिए चाहते हैं देता है। वह, मैं 99.44% निश्चित हूं imageWithData: चाहता है।

नोट: यदि आप Image2 बनाने से पहले डेटा हेरफेर करने के लिए देख रहे हैं, तो आप प्रदर्शन डेटा, जिस स्थिति में थोड़ा अधिक जटिल है जिस तरह से आप एक छवि है कि से वापस मिल चाहते हैं , लेकिन कुछ लग रहा है इस तरह:

// Create a color space 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    if (colorSpace == NULL) 
    { 
     fprintf(stderr, "Error allocating color space\n"); 
     return nil; 
    } 

    CGContextRef context = CGBitmapContextCreate (bits, size.width, size.height, 
      8, size.width * 4, colorSpace, 
      kCGImageAlphaPremultipliedLast | IMAGE_BYTE_ORDER 
      ); 
    CGColorSpaceRelease(colorSpace); 

    if (context == NULL) 
    { 
     fprintf (stderr, "Error: Context not created!"); 
     return nil; 
    } 

    CGImageRef ref = CGBitmapContextCreateImage(context); 
    //free(CGBitmapContextGetData(context));          //* this appears to free bits -- probably not mine to free! 
    CGContextRelease(context); 

    UIImage *img = [UIImage imageWithCGImage:ref]; 
    CFRelease(ref);                //* ?!?! Bug in 3.0 simulator. Run in 3.1 or higher. 

    return img; 

(।।। उपरोक्त कोड एरिका Sadun द्वारा उदाहरण से ली गई है स्मार्ट भागों उसकी कर रहे हैं; गलतियों सब मेरे हैं लेकिन इस सामान्य विचार है, और यह काम करना चाहिए)