2009-07-16 11 views
28

Ho un UIView che sto cercando di rendere in un UIImage utilizzando [CALayer renderInContext:]. Tuttavia, trovo che l'immagine risultante sia capovolta verticalmente. Mi aspetto questo a causa dei diversi sistemi di coordinate. Tuttavia, ho quindi provare a capovolgere il quadro torna alla normalità con una trasformazione affine - ma non ha alcun effetto:Ribaltamento verticale di CGContext

CGAffineTransform flipVertical = CGAffineTransformMake(
    1, 0, 0, -1, 0, imageContextHeight 
); 
CGContextConcatCTM(imageContext, flipVertical); 
CGImageRef cgImage = CGBitmapContextCreateImage(imageContext); 
UIImage* uiImage = [[UIImage imageWithCGImage:cgImage] retain]; 
CGImageRelease(cgImage); 

Che cosa sto facendo di sbagliato?

risposta

26

Il CTM colpisce futuro disegno; stai catturando ciò che hai già disegnato. Devi concatenare questa trasformazione prima di disegnare, non dopo.

29

Ecco po 'di codice che ho scritto basandomi su questa risposta, nel caso in cui è utile a chiunque:

#import <QuartzCore/QuartzCore.h> 
... 
+ (UIImage *) flipImageVertically:(UIImage *)originalImage { 
    UIImageView *tempImageView = [[UIImageView alloc] initWithImage:originalImage]; 

    UIGraphicsBeginImageContext(tempImageView.frame.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGAffineTransform flipVertical = CGAffineTransformMake(
      1, 0, 0, -1, 0, tempImageView.frame.size.height 
    ); 
    CGContextConcatCTM(context, flipVertical); 

    [tempImageView.layer renderInContext:context]; 

    UIImage *flipedImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    [tempImageView release]; 

    return flipedImage; 
} 
4

Qui è lo stesso codice come sopra (risposta di benvolioT), ma in SWIFT

import QuartzCore 
... 
func flipImageVertically(originalImage:UIImage) -> UIImage{ 

    let tempImageView:UIImageView = UIImageView(image: originalImage) 
    UIGraphicsBeginImageContext(tempImageView.frame.size) 
    let context:CGContextRef = UIGraphicsGetCurrentContext() 
    let flipVertical:CGAffineTransform = CGAffineTransformMake(1,0,0,-1,0,tempImageView.frame.size.height) 
    CGContextConcatCTM(context, flipVertical) 
    tempImageView.layer .renderInContext(context) 

    let flippedImage:UIImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    return flippedImage 
} 

E qui è un modo ancora migliore in SWIFT:

func flipImageVertically(originalImage:UIImage) -> UIImage { 
    let image:UIImage = UIImage(CGImage: originalImage.CGImage, scale: 1.0, orientation: UIImageOrientation.RightMirrored)! 
    return image 
} 
1

io uso questo codice swift:

  UIGraphicsBeginImageContextWithOptions(myImageView.image!.size, false, 1.0) 

      var context = UIGraphicsGetCurrentContext() 

      //move and invert canvas by scaling 
      CGContextTranslateCTM(context, myImageView.image!.size.width, 0) 
      CGContextScaleCTM(context, -1, 1) 

      myImageView.image!.drawInRect(CGRect(x: 0, y: 0, width: myImageView.image!.size.width, height: myImageView.image!.size.height)) 

      // move back and reinvert 
      CGContextScaleCTM(context, 1, 1) 
      CGContextTranslateCTM(context, -myImageView.image!.size.width, 0) 

      let flippedImg = UIGraphicsGetImageFromCurrentImageContext() 

      myImageView.image = flippedImg 

      UIGraphicsEndImageContext() 
Problemi correlati