2010-09-22 4 views
9

Por ejemplo, el archivo png es 1200 (h) x 50 (w) píxeles, ¿cómo puedo cortar png y cargas en 6 UIImage s, cada 200 (h) x 50 (w). ¡Gracias!Cómo cortar un png grande de sprites en UIImages más pequeños?

EDITAR - gracias a la respuesta de Michal, el código final:

CGImageRef imageToSplit = [UIImage imageNamed:@"huge.png"].CGImage; 
CGImageRef partOfImageAsCG = CGImageCreateWithImageInRect(imageToSplit, CGRectMake(0, 0, 50, 50)); 

UIImage *partOfImage = [UIImage imageWithCGImage:partOfImageAsCG]; 
// ... 

CGImageRelease(partOfImageAsCG); 

Respuesta

13

mirada a la función CGImageCreateWithImageInRect. Funciona con CGImage, pero es fácil de convertir entre ese y UIImage.

He aquí un ejemplo (a máquina de la memoria, no podría compilar):

CGImageRef imageToSplit = [UIImage imageNamed:@"huge.png"].CGImage; 
CGImageRef partOfImageAsCG = CGImageCreateWithImageInRect(imageToSplit, CGRectMake(0, 0, 200, 50)); 
CGRelease(imageToSplit); 
UIImage *partOfImage = [UIImage imageWithCGImage:partOfImageAsCG]; 
CGImageRelease(partOfImageAsCG); 
+4

Lo que quiere es CGImageRelease() no CGRelease() –

+1

Gracias Andrew, lo he corregido y aumentado su comentario. – Michal

2

Un método reutilizable:

-(UIImage*)ExtractImageOn:(CGPoint)pointExtractedImg ofSize:(CGSize)sizeExtractedImg FromSpriteSheet:(UIImage*)imgSpriteSheet 
{ 
    UIImage *ExtractedImage; 

    CGRect rectExtractedImage; 

    rectExtractedImage=CGRectMake(pointExtractedImg.x,pointExtractedImg.y,sizeExtractedImg.width,sizeExtractedImg.height); 

    CGImageRef imgRefSpriteSheet=imgSpriteSheet.CGImage; 

    CGImageRef imgRefExtracted=CGImageCreateWithImageInRect(imgRefSpriteSheet,rectExtractedImage); 

    ExtractedImage=[UIImage imageWithCGImage:imgRefExtracted]; 

    CGImageRelease(imgRefExtracted); 

    //CGImageRelease(imgRefSpriteSheet); I have commented it because we should not release the object that we don't own..So why do we release imgRefExtracted alone? bcuz it has name create in its method so the ownership comes to us so we have to release it. 

    return ExtractedImage; 


} 

FYI:

Apesar de que ha sido contestada Claramente, pensé que darlo como un simple fragmento de código reutilizable 'Copiar y Pegar' sería una gran ayuda para o los programadores y yo atribuimos la respuesta al michal

Cuestiones relacionadas