2010-02-10 17 views
6

Sto creando un collage combinato con elementi di altre immagini. Ecco alcuni arte ASCII per spiegare quello che sto facendo:Più ritagli ritagliati per creare collage in Core Graphics

Given images A, B and C, 
AAA, BBB, CCC 
AAA, BBB, CCC 
AAA, BBB, CCC 

I take part of A, part of B and part of C as columns: 

Axx, xBx, xxC 
Axx, xBx, xxC 
Axx, xBx, xxC 

...and combine them in one image like this: 

ABC 
ABC 
ABC 

where the first 1/3rd of the image is a colum of A's pic, the middle is a column of B's pic and the last is a column of C's pic. 

ho un po 'di codice scritto, ma sta mostrando solo la prima colonna e non il resto ... penso di avere per cancellare il ritaglio in qualche modo, bt sono non sono sicuro di come farlo o se questo è anche l'approccio migliore.

+ (UIImage *)collageWithSize:(NSInteger)size fromImages:(NSArray *)images { 
    NSMutableArray *selectedImages = [NSMutableArray array]; 
    [selectedImages addObjectsFromArray:images]; 

    // use the selectedImages for generating the thumbnail 
    float columnWidth = (float)size/(float)[selectedImages count]; 

    //create a context to do our clipping in 
    UIGraphicsBeginImageContext(CGSizeMake(size, size)); 
    CGContextRef currentContext = UIGraphicsGetCurrentContext(); 

    for (int i = 0; i < [selectedImages count]; i++) { 
     // get the current image 
     UIImage *image = [selectedImages objectAtIndex:i]; 

     //create a rect with the size we want to crop the image to 
     CGRect clippedRect = CGRectMake(i*columnWidth, 0, columnWidth, size); 
     CGContextClipToRect(currentContext, clippedRect); 

     //create a rect equivalent to the full size of the image 
     CGRect drawRect = CGRectMake(0, 0, size, size); 

     //draw the image to our clipped context using our offset rect 
     CGContextDrawImage(currentContext, drawRect, image.CGImage); 
    } 

    //pull the image from our cropped context 
    UIImage *collage = UIGraphicsGetImageFromCurrentImageContext(); 

    //pop the context to get back to the default 
    UIGraphicsEndImageContext(); 

    //Note: this is autoreleased 
    return collage; 
} 

Cosa sto sbagliando?

PS Anche l'immagine è sottosopra.

risposta

9

CGContextClipToRect interseca il rettangolo di ritaglio corrente con l'argomento fornito. Quindi, la seconda volta che lo chiami, stai effettivamente trasformando la tua area di ritaglio in nulla.

Non è possibile ripristinare l'area di ritaglio senza ripristinare lo stato della grafica. Quindi, effettua una chiamata a CGContextSaveGState nella parte superiore del ciclo e una chiamata a CGContextRestoreGState nella parte inferiore.

La parte capovolta può essere riparata regolando la matrice di trasformazione corrente: chiamare CGContextTranslateCTM per spostare l'origine e quindi CGContextScaleCTM per capovolgere l'asse y.

+1

' CGContextSaveGState' e 'CGContextRestoreGState' sono ciò che stavo cercando. Grazie! –

0

L'immagine in basso a testa possono essere corretti chiamando il metodo seguito:

CGImageRef flip (CGImageRef im) { 
CGSize sz = CGSizeMake(CGImageGetWidth(im), CGImageGetHeight(im)); 
UIGraphicsBeginImageContextWithOptions(sz, NO, 0); 
CGContextDrawImage(UIGraphicsGetCurrentContext(), 
        CGRectMake(0, 0, sz.width, sz.height), im); 
CGImageRef result = [UIGraphicsGetImageFromCurrentImageContext() CGImage]; 
UIGraphicsEndImageContext(); 
return result; 

}

prendere l'aiuto da sotto il codice da dove u inserire questo codice:

UIGraphicsBeginImageContextWithOptions(CGSizeMake(leftRect.size.width, leftRect.size.height), NO, 0); 
CGContextRef con = UIGraphicsGetCurrentContext(); 
CGContextDrawImage(con, leftRect,flip(leftReference)); 
Problemi correlati