2012-04-05 3 views
5

ho creato una funzione per suddividere un'immagine in più immagini, ma quando prendo prendere il CGImage del UIImage, il CGImage restituisce nullCGImage di UIImage tornare 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

controllo tempArray è nullo o non in ultima – Hector

+1

CGImage non è un oggetto, è una struct C, in modo da non dovrebbe usare un NSLog con% @. – lnafziger

+0

Il problema è che ho creato UIImage con una IOSurface: D – Otium

risposta

4

La proprietà CGImage restituirà nullo se l'UIImage è stato creato da un'altra immagine, come un IOSurface o CIImage. Per aggirare il problema in questo caso particolare, posso creare un CGImage da una IOSurface usando la funzione c, quindi convertirlo in una UIImage.

UICreateCGImageFromIOSurface(IOSurfaceRef surface); 
2

Quello che hai fatto ora è solo creare pezzi con 0.f larghezza, è necessario utilizzare due for s per definire lo width & height per i propri pezzi. Esempio di codice come questo (non ancora testato, ma dovrebbe funzionare):

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 Ho codice (testato) che esegue questa operazione e corrisponde al tuo suggerimento. Il mio è impacchettato come un metodo di categoria su UIImage chiamato subimageInRect: (CGRect) rect. Penso che sia un modo carino per andare. – danh

1

Accade in alcuni casi quando si tenta di ritagliare l'immagine. Ho trovato la soluzione in questo modo provare questo potrebbe essere questo può aiutare: -

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

ho creato UIImage da CGImage.

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

E ora newImage.CGImage non è nil