2012-04-05 21 views
5

मैं कई छवियों में एक छवि विभाजित करने के लिए एक समारोह बनाई गई, लेकिन जब मैं UIImage की CGImage ले लेते हैं, CGImage NULL भेजता हैUIImage की CGImage वापसी शून्य

NSArray* splitImage(UIImage* image,NSUInteger pieces) { 

NSLog(@"width: %f, %zu",image.size.width,CGImageGetWidth(image.CGImage)); 
NSLog(@"%@",image.CGImage); 
returns NULL 
NSMutableArray* tempArray = [[NSMutableArray alloc]initWithCapacity:pieces]; 

CGFloat piecesSize = image.size.height/pieces; 

for (NSUInteger i = 0; i < pieces; i++) { 

    // take in account retina displays 
    CGRect subFrame = CGRectMake(0,i * piecesSize * image.scale ,image.size.width * image.scale,piecesSize * image.scale); 

    CGImageRef newImage = CGImageCreateWithImageInRect(image.CGImage,subFrame); 

    UIImage* finalImage =[UIImage imageWithCGImage:newImage]; 

    CGImageRelease(newImage); 

    [tempArray addObject:finalImage]; 

} 

NSArray* finalArray = [NSArray arrayWithArray:tempArray]; 

[tempArray release]; 

return finalArray; 



} 
+0

जांच tempArray अशक्त या नहीं पिछले – Hector

+1

CGImage में है नहीं एक वस्तु है, यह एक सी struct है है, तो आप% @ के साथ एक NSLog नहीं का उपयोग करना चाहिए। – lnafziger

+0

समस्या यह थी कि मैंने IOSurface के साथ UIImage बनाया: D – Otium

उत्तर

4

CGImage संपत्ति शून्य वापस आ जाएगी इस तरह के एक IOSurface या CIImage के रूप में अगर UIImage एक और छवि से बनाया गया था। इस विशेष मामले में इसे पाने के लिए मैं सी फ़ंक्शन का उपयोग करके आईओएसयूफ़ेस से एक CGImage बना सकता हूं और फिर इसे UIImage में परिवर्तित कर सकता हूं।

UICreateCGImageFromIOSurface(IOSurfaceRef surface); 
2

क्या आप अब सिर्फ टुकड़े बनाने है किया 0.f साथ चौड़ाई, आप अपने टुकड़े के लिए width & height परिभाषित करने के लिए दो for रों उपयोग करना चाहिए। इस तरह कोड का नमूना (अभी तक जांच नहीं की है, लेकिन यह काम करता है चाहिए):

for (int height = 0; height < image.size.height; height += piecesSize) { 
    for (int width = 0; width < image.size.width; width += piecesSize) { 
    CGRect subFrame = CGRectMake(width, height, piecesSize, piecesSize); 

    CGImageRef newImage = CGImageCreateWithImageInRect(image.CGImage, subFrame); 
    UIImage * finalImage = [UIImage imageWithCGImage:newImage]; 
    CGImageRelease(newImage); 

    [tempArray addObject:finalImage]; 
    } 
} 
+1

+1 मेरे पास (परीक्षण) कोड है जो यह करता है, और यह आपके सुझाव से मेल खाता है। मेरा यूआईएममेज पर एक श्रेणी विधि के रूप में पैक किया जाता है जिसे सबमिटेज इंट्रैक कहा जाता है: (सीजीईजीईटी) आयत। मुझे लगता है कि यह जाने का एक सुंदर तरीका है। – danh

1

यह कुछ मामलों में होता है जब हम चित्र काटने के लिए प्रयास करें। मैंने पाया इस तरह समाधान की कोशिश इस इस मदद कर सकता है हो सकता है: -

NSData *imageData = UIImageJPEGRepresentation(yourImage, 0.9); 
newImage = [UIImage imageWithData:imageData]; 
2

मैं CGImage से UIImage बनाया है।

CIImage *ciImage = image.CIImage; 
CIContext *context = [CIContext contextWithOptions:nil]; 
CGImageRef ref = [context createCGImage:ciImage fromRect:ciImage.extent]; 
UIImage *newImage = [UIImage imageWithCGImage:ref]; 

और अब newImage.CGImage नहीं nil

संबंधित मुद्दे