2012-04-05 10 views
5

habe ich eine Funktion für ein Bild in mehrere Bilder aufgeteilt, aber wenn ich die CGImage des UIImage nehmen nehmen, gibt die CGImage NULLCGImage von UIImage NULL zurück

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

Scheck TempArray null ist oder nicht in letzter – Hector

+1

CGImage ist kein Objekt, es ist eine C-Struktur ist, so sollten Sie keine NSLog mit% @ werden. – lnafziger

+0

Das Problem war, dass ich die UIImage mit einer IOSurface erstellt habe: D – Otium

Antwort

4

Die CGImage Eigenschaft null zurück, wenn die UIImage aus einem anderen Bild erstellt wurde, wie ein IOSurface oder CIImage. Um dies in diesem speziellen Fall zu umgehen, kann ich mit der c-Funktion ein CGImage von einer IOSurface erstellen und dieses dann in ein UIImage konvertieren.

UICreateCGImageFromIOSurface(IOSurfaceRef surface); 
2

Was haben Sie jetzt gerade Stücke erstellen mit 0.f width, sollten Sie zwei for s verwenden, um die width & height für Ihre Stücke zu definieren. Codebeispiel wie folgt (nicht getestet, aber es sollte funktionieren):

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 Ich habe (getestet) Code, der dies tut, und es entspricht Ihrem Vorschlag. Mine ist als Kategoriemethode für UIImage verpackt, genannt subimageInRect: (CGRect) rect. Ich denke, das ist ein schöner Weg zu gehen. – danh

1

Es passiert in einigen Fällen, wenn wir versuchen, Bild zu beschneiden. Ich fand, wie dies die Lösung versuchen, dies auch sein mag diese Ihnen helfen kann: -

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

Ich habe UIImage von CGImage erstellt.

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

Und jetzt newImage.CGImage ist nicht nil