2010-02-10 5 views
6

Je crée un collage combiné avec des éléments d'autres images. Voici quelques ASCII art d'expliquer ce que je fais:Plusieurs liens écrêtés pour créer un collage dans les graphiques de base

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. 

J'ai un code écrit, mais il montre que la première colonne et pas le reste ... Je pense que je dois effacer la coupure en quelque sorte, bt je suis pas sûr de la façon de le faire ou si c'est même la meilleure approche.

+ (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; 
} 

Qu'est-ce que je fais mal?

PS l'image est également dessinée à l'envers.

Répondre

9

CGContextClipToRect croise le rectangle de découpage actuel avec l'argument fourni. Donc, la deuxième fois que vous l'appelez, vous tournez votre région de découpage à zéro.

Il n'existe aucun moyen de restaurer la zone de découpage sans restaurer l'état graphique. Alors, faites un appel à CGContextSaveGState en haut de votre boucle et un appel à CGContextRestoreGState en bas.

La partie à l'envers peut être fixée en ajustant la matrice de transformation en cours: appelez CGContextTranslateCTM pour déplacer l'origine, puis CGContextScaleCTM pour retourner l'axe y.

+1

' CGContextSaveGState' et 'CGContextRestoreGState' sont ce que je cherchais. Merci! –

0

L'image à l'envers peut être corrigée en appelant la méthode ci-dessous:

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; 

}

Prenez l'aide de dessous le code à où u mettre ce code:

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