2010-09-22 2 views
9

Zum Beispiel ist die PNG-Datei 1200 (h) x 50 (w) Pixel, wie kann ich schneiden die png und lädt in 6 UIImage s, jeweils 200 (h) x 50 (w). Vielen Dank!Wie kann man ein großes Sprite-Png in kleinere UImages schneiden?

EDIT - dank Michal Antwort, der endgültige Code:

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

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

CGImageRelease(partOfImageAsCG); 

Antwort

13

Blick auf CGImageCreateWithImageInRect Funktion. Es funktioniert mit CGImage, aber es ist einfach zwischen diesem und UIImage zu konvertieren.

Hier ist ein Beispiel (aus dem Speicher eingegeben haben, möglicherweise nicht kompilieren):

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

Was Sie wollen, ist CGImageRelease() nicht CGRelease() –

+1

Dank Andrew, ich habe es behoben und Ihren Kommentar erhöht. – Michal

2

Eine wiederverwendbare Methode:

-(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:

Eventhough es beanwortet Klar, ich dachte, es wäre ein einfaches, wiederverwendbares "Copy-Paste" Code-Snippet wäre eine Menge Hilfe o Programmierer und ich die Antwort auf michal

Verwandte Themen