2009-07-16 7 views
28

[CALayer renderInContext:]を使用してUIImageにレンダリングしようとしているUIViewがあります。しかし、結果として得られる画像は垂直方向に反転していることがわかります。私は、さまざまな座標系のためにこれを期待しています。しかし、私は、試してみて、反転コンテキストを正常に戻りアフィン変換して - それは何の効果もありません。私は間違っ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); 

何をしているのですか?

答えて

26

CTMは将来の描画に影響します。すでに描いたものをキャプチャしています。描画する前にその変換を連結する必要があります。ここで

29

は場合に、それは誰にも便利です、私はこの回答をもとに書いたいくつかのコードです:ここでは

#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

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 
} 
(benvolioTの答え)上記のようにしかし、SWIFT

で同じコードでありますここ

そしてSWIFTでさらに良い方法です:私は迅速にこのコードを使用

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

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