2012-04-05 14 views
5

creé una función para dividir una imagen en múltiples imágenes, pero cuando tomo tomar la CGImage del UIImage, la CGImage devuelve NULLCGImage de UIImage devuelve NULL

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

cheque tempArray es nulo o no en última – Hector

+1

CGImage no es un objeto, es una estructura C, por lo que no deberían usar un NSLog con% @. – lnafziger

+0

El problema fue que creé el UIImage con un IOSurface: D – Otium

Respuesta

4

La propiedad CGImage devolverá nil si el UIImage fue creado a partir de otra imagen, como un IOSurface o CIImage. Para evitar esto en este caso particular, puedo crear una CGImage desde una IOSurface usando la función c y luego convertir eso en un UIImage.

UICreateCGImageFromIOSurface(IOSurfaceRef surface); 
2

Lo que hizo que ahora se acaba de crear piezas con 0.f ancho, debe usar dos for s para definir el width & height para sus piezas. Código de ejemplo como este (no probado aún, pero debería funcionar):

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 Tengo un código (probado) que hace esto, y coincide con su sugerencia. El mío está empaquetado como un método de categoría en UIImage llamado subimageInRect: (CGRect) rect. Creo que es una forma más bonita de ir. – danh

1

Ocurre en algunos casos cuando tratamos de recortar la imagen. He encontrado la solución como ésta intente esto puede ser que esto puede ayudarle a: -

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

He creado UIImage de CGImage.

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

Y ahora newImage.CGImage no es nil

Cuestiones relacionadas