UIImageを水平に反転する方法は?


111

UIImage水平方向に反転する方法UIImageOrientationUpMirroredUIImageクラス参照に列挙値、このプロパティを使用して反転する方法を見つけましたUIImage


arothのすばらしい答えに加えて、Appleはこのリンク
coco

承認された方法ではうまくいかなかったため、このカテゴリを見つけました。魅力のように機能します。
dwbrito 2013

回答:


237

Objective-C

UIImage* sourceImage = [UIImage imageNamed:@"whatever.png"];

UIImage* flippedImage = [UIImage imageWithCGImage:sourceImage.CGImage 
                                            scale:sourceImage.scale
                                      orientation:UIImageOrientationUpMirrored];

迅速

let flippedImage = myImage.withHorizontallyFlippedOrientation()

14
この回答には二つの問題があります-規模は、網膜competible画像では1.0ではなく、何らかの理由でUIImageOrientationUpしばらくは働いていたUIImageOrientationUpMirroredそれを反転しませんでした。これは、働いていた-image = [UIImage imageWithCGImage:image.CGImage scale:image.scale orientation:UIImageOrientationUp]
Kofの

1
@Kofが気付いたように、渡した方向パラメータは、「この画像にこの特定の方向を与える」ではなく、「sourceImageの方向はすでに何であるか」を決定するために使用されます。したがって、sourceImage.imageOrientationパラメーターを調べ、別の方向に渡して、メソッドをだまして必要なものを提供できます
Ege Akpinar

6
sourceImage.scaleスケールに使用した方が良いでしょう。
Sam Soffes 2013年

Swiftでこれを行う方法は?[UIImage imageWithCGImage ...]は使用できません。
Lim Thye Chean 14

3
私がやろうとすると、これは完全に壊れるようです[flippedImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]。なぜだと思いますか?
devios1

70

これを実現する非常に簡単な方法は、UIImageの代わりにUIImageViewを作成し、UIImageViewで変換を行うことです。

yourImageView.image =[UIImage imageNamed:@"whatever.png"];
yourImageView.transform = CGAffineTransform(scaleX: -1, y: 1); //Flipped

お役に立てれば。


2
これはUIImageUIImageRenderingModeAlwaysTemplateレンダリングモードと組み合わせると副作用があることがわかった操作よりもはるかにうまく機能するようになりました。
devios1 2015年

2
これを共有していただきありがとうございます。私はこの投稿に関連付けられたこのパズルの「答え」を見つけることができませんでしたが、あなたの答えは驚くほどうまくいき、たった1行のコードでした。
エイドリアン

よく働く!iOS 9以降には、flipsForRightToLeftLayoutDirectionも含まれていますが、iOS 8以降のアプリではまだ機能しません。

3
フリッピングをリセットする場合は、次を使用しますyourImageView.transform = CGAffineTransformIdentity
chanil

このメソッドは、UIImageViewで「変換」することに注意してください。実際のUIImageは反転しません。
遅い

36

を使用してOpenGLテクスチャを初期化するには、垂直反転が必要になることがよくありますglTexImage2d(...)。上記のトリックは実際には画像データを変更しないため、この場合は機能しません。https://stackoverflow.com/a/17909372から着想を得た実際のデータフリップを行うコードを次に示します

- (UIImage *)flipImage:(UIImage *)image
{
    UIGraphicsBeginImageContext(image.size);
    CGContextDrawImage(UIGraphicsGetCurrentContext(),CGRectMake(0.,0., image.size.width, image.size.height),image.CGImage);
    UIImage *i = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return i;
}

1
この画像はどのように反転しますか?再び画像を描くように見えます。
ジョナサン。

@ジョナサン。描画中の座標系(Y軸方向)が異なるため、反転すると思います。
Alexey Podlasov、2015年

これを使用して画像を垂直方向に反転させる方法はありますか?
Praxiteles

このメソッドは、画像のレンダリングも
適切に

3
品質の問題を修正するには、UIGraphicsBeginImageContextWithOptions(image.size、NO、image.scale);を使用します。代わりに。
Nick Lockwood

14

私はimageFlippedForRightToLeftLayoutDirectionを試してみて、異なる方向で新しいUIImageを作成しましたが、少なくともこれが画像を反転させるための唯一の解決策です

let ciimage: CIImage = CIImage(CGImage: imagenInicial.CGImage!)
let rotada3 = ciimage.imageByApplyingTransform(CGAffineTransformMakeScale(-1, 1))

あなたが私の遊び場で見ることができるように、それはうまくいった!:) ここに画像の説明を入力してください

そしてもちろん、finalImage = UIImage(CIImage:rotada3)


申し訳ありませんが、これは少なくともカメラで撮影した写真では機能しなくなったようです...
Oni_01

12

画像の向きが定義するとおり:

typedef NS_ENUM(NSInteger, UIImageOrientation) {
UIImageOrientationUp,            // default orientation
UIImageOrientationDown,          // 180 deg rotation
UIImageOrientationLeft,          // 90 deg CCW
UIImageOrientationRight,         // 90 deg CW
UIImageOrientationUpMirrored,    // as above but image mirrored along other axis. horizontal flip
UIImageOrientationDownMirrored,  // horizontal flip
UIImageOrientationLeftMirrored,  // vertical flip
UIImageOrientationRightMirrored, // vertical flip
};

AVCaptureSessionからのUIImageの処理など、より多くの状況でいくつかの改善を行いました。

UIImage* sourceImage = [UIImage imageNamed:@"whatever.png"];
UIImageOrientation flipingOrientation;
if(sourceImage.imageOrientation>=4){
    flippedOrientation = sourceImage.imageOrientation - 4;
}else{
    flippedOrientation = sourceImage.imageOrientation + 4;
}
UIImage* flippedImage = [UIImage imageWithCGImage:sourceImage.CGImage 
                     scale: sourceImage.scale orientation: flipingOrientation];

9

ここに迅速なバージョンがあります:(私はコメントでこの質問を見ました)

let srcImage = UIImage(named: "imageName")
let flippedImage = UIImage(CGImage: srcImage.CGImage, scale: srcImage.scale, orientation: UIImageOrientation.UpMirrored)


7

これは、UIImageを水平方向にミラーリング/フリップする強固な実装であり、画像に前後に適用できます。元になる画像データを変更するため、描画(スクリーンショットなど)も変更されます。動作確認済みで、品質の低下はありません。

func flipImage() -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
        let bitmap = UIGraphicsGetCurrentContext()!

        bitmap.translateBy(x: size.width / 2, y: size.height / 2)
        bitmap.scaleBy(x: -1.0, y: -1.0)

        bitmap.translateBy(x: -size.width / 2, y: -size.height / 2)
        bitmap.draw(self.cgImage!, in: CGRect(x: 0, y: 0, width: size.width, height: size.height))

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image?
}

5

これはいくつかのために役立つでしょう:

    UIImageOrientation imageOrientation;

    switch (sourceImage.imageOrientation) {
        case UIImageOrientationDown:
            imageOrientation = UIImageOrientationDownMirrored;
            break;

        case UIImageOrientationDownMirrored:
            imageOrientation = UIImageOrientationDown;
            break;

        case UIImageOrientationLeft:
            imageOrientation = UIImageOrientationLeftMirrored;
            break;

        case UIImageOrientationLeftMirrored:
            imageOrientation = UIImageOrientationLeft;

            break;

        case UIImageOrientationRight:
            imageOrientation = UIImageOrientationRightMirrored;

            break;

        case UIImageOrientationRightMirrored:
            imageOrientation = UIImageOrientationRight;

            break;

        case UIImageOrientationUp:
            imageOrientation = UIImageOrientationUpMirrored;
            break;

        case UIImageOrientationUpMirrored:
            imageOrientation = UIImageOrientationUp;
            break;
        default:
            break;
    }

    resultImage = [UIImage imageWithCGImage:sourceImage.CGImage scale:sourceImage.scale orientation:imageOrientation];


2

単純な拡張。

extension UIImage {

    var flipped: UIImage {
        guard let cgImage = cgImage else {
            return self
        }

        return UIImage(cgImage: cgImage, scale: scale, orientation: .upMirrored)
    }
}

使用法:

let image = #imageLiteral(resourceName: "imageName")
let imageView = UIImageView(image: image.flipped)

拡張機能はSwiftの優れた機能の1つです。I "mはそれをお勧めするには、上記のオリジナルの答えが失敗したことを驚いて、私はかなり良く、このバージョンのように。。
DS。

1

これは動作するiOS8 / 9互換バージョンです:

UIImage *image = [UIImage imageNamed:name];

if ([[UIApplication sharedApplication] userInterfaceLayoutDirection] == UIUserInterfaceLayoutDirectionRightToLeft) {

    if ([image respondsToSelector:@selector(imageFlippedForRightToLeftLayoutDirection)]) {
        //iOS9
        image = image.imageFlippedForRightToLeftLayoutDirection;
    }
    else {
        //iOS8
        CIImage *coreImage = [CIImage imageWithCGImage:image.CGImage];
        coreImage = [coreImage imageByApplyingTransform:CGAffineTransformMakeScale(-1, 1)];
        image = [UIImage imageWithCIImage:coreImage scale:image.scale orientation:UIImageOrientationUp];
    }
}

return image;

これは最高のアイデアだとは思いません。これimageFlippedForRightToLeftLayoutDirection は、たとえばアラビア語の国など、レイアウトの方向を反転して使用するためのものです。したがって、これを使用しても必ずしも期待どおりに動作するとは限りません。
Peter Stajger、2016年

1
はい、あなたは正しいです-私の場合、それはまさにRTLサポートのためでした。私たちは皆、SOのコードが参照用であることを知っており、人々は最初にそれを理解せずに単にコピー/貼り付けするだけではありませんよね?
capikaw 2016年

1

Swift 3以降でテスト済み

これは、拡張機能でこの問題を解決するための簡単な解決策です。私はそれをテストし、それは働いた。任意の方向にミラーリングできます。

extension UIImage {

    func imageUpMirror() -> UIImage {
        guard let cgImage = cgImage else { return self }
        return UIImage(cgImage: cgImage, scale: scale, orientation: .upMirrored)
    }

    func imageDownMirror() -> UIImage {
        guard let cgImage = cgImage else { return self }
        return UIImage(cgImage: cgImage, scale: scale, orientation: .downMirrored)
    }

    func imageLeftMirror() -> UIImage {
        guard let cgImage = cgImage else { return self }
        return UIImage(cgImage: cgImage, scale: scale, orientation: .leftMirrored)
    }

    func imageRightMirror() -> UIImage {
        guard let cgImage = cgImage else { return self }
        return UIImage(cgImage: cgImage, scale: scale, orientation: .rightMirrored)
    }
}

このコードの使用法

let image = #imageLiteral(resourceName: "imageName")
flipHorizontally = image.imageUpMirror()

など、他の関数を使用することができます。


0

修正上記とにおける回答のここでの1 スウィフト3あなたはニーズが画像を前後を反転維持するというボタンを持っているときに私が特に有用であることが分かっていること。

func flipImage(sourceImage: UIImage,orientation: UIImageOrientation) -> UIImage {


        var imageOrientation = orientation

        switch sourceImage.imageOrientation {

        case UIImageOrientation.down:
            imageOrientation = UIImageOrientation.downMirrored;
            break;

        case UIImageOrientation.downMirrored:
            imageOrientation = UIImageOrientation.down;
            break;

        case UIImageOrientation.left:
            imageOrientation = UIImageOrientation.leftMirrored;
            break;

        case UIImageOrientation.leftMirrored:
            imageOrientation = UIImageOrientation.left;

            break;

        case UIImageOrientation.right:
            imageOrientation = UIImageOrientation.rightMirrored;

            break;

        case UIImageOrientation.rightMirrored:
            imageOrientation = UIImageOrientation.right;

            break;

        case UIImageOrientation.up:
            imageOrientation = UIImageOrientation.upMirrored;
            break;

        case UIImageOrientation.upMirrored:
            imageOrientation = UIImageOrientation.up;
            break;


        }


        return UIImage(cgImage: sourceImage.cgImage!, scale: sourceImage.scale, orientation: imageOrientation)

    }

使用する:

imageToFlip: UIImage = flipImage(sourceImage: imageToFlip, orientation: imageToFlip.imageOrientation)

0

SWIFT 3でのarothの回答

let sourceImage = UIImage(named: "whatever.png")!
let flippedImage = UIImage(cgImage: sourceImage.cgImage!, scale: sourceImage.scale, orientation: .upMirrored)

0

スウィフト4

yourImage.transform = CGAffineTransform(scaleX: -1, y: 1)

3
コードのみの回答は、一般に低品質と見なされます。コードに加えて、コードの機能/理由、問題の修正、または質問への回答を説明します。
chharvey 2017

1
また、画像を反転するように求めているため、これはOPの質問には機能しません。ここのコードは画像ビューを反転します。どちらも使用できる点が大きく異なります。例えば、ボタンは画像ビューではなく画像を取ります。
DS。

また、あなたは私の答えをコピーして、swift 4
Shaked Sayagを作成

0

アンラップするため、以下を実行します。

let srcImage = UIImage(named: "myimage")!
let flippedImage = UIImage(cgImage: srcImage.cgImage!, 
                   scale: srcImage.scale, orientation: UIImage.Orientation.upMirrored)

0

これを使って好きなように画像を回転させることができます

SWIFT 4

extension UIImage {
public func imageRotatedByDegrees(degrees: CGFloat, flip: Bool) -> UIImage {
    let radiansToDegrees: (CGFloat) -> CGFloat = {
        return $0 * (180.0 / CGFloat(M_PI))
    }
    let degreesToRadians: (CGFloat) -> CGFloat = {
        return $0 / 180.0 * CGFloat(M_PI)
    }

    // calculate the size of the rotated view's containing box for our drawing space
    let rotatedViewBox = UIView(frame: CGRect(origin: CGPoint.zero, size: size))
    let t = CGAffineTransform(rotationAngle: degreesToRadians(degrees));
    rotatedViewBox.transform = t
    let rotatedSize = rotatedViewBox.frame.size

    // Create the bitmap context
    UIGraphicsBeginImageContext(rotatedSize)
    let bitmap = UIGraphicsGetCurrentContext()!

    bitmap.translateBy(x: rotatedSize.width / 2.0, y: rotatedSize.height / 2.0)
    // Move the origin to the middle of the image so we will rotate and scale around the center.
    //CGContextTranslateCTM(bitmap, rotatedSize.width / 2.0, rotatedSize.height / 2.0);

    //   // Rotate the image context
    bitmap.rotate(by: degreesToRadians(degrees))
   // CGContextRotateCTM(bitmap, degreesToRadians(degrees));

    // Now, draw the rotated/scaled image into the context
    var yFlip: CGFloat

    if(flip){
        yFlip = CGFloat(-1.0)
    } else {
        yFlip = CGFloat(1.0)
    }
    bitmap.scaleBy(x: yFlip, y: -1.0)
    //CGContextScaleCTM(bitmap, yFlip, -1.0)
    bitmap.draw(self.cgImage!, in: CGRect.init(x: -size.width / 2, y: -size.height / 2, width: size.width, height: size.height))
   // CGContextDrawImage(bitmap, CGRectMake(-size.width / 2, -size.height / 2, size.width, size.height), CGImage)

    let newImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()

    return newImage
}

}


0

Swift 5-Xcode 11.5

水平回転の最適なソリューション:このビデオを見る:

https://m.youtube.com/watch?v=4kSLbuB-MlU

または、次のコードを使用します。

    
import UIKit
class FirstViewControl: UIViewController {
    @IBOutlet weak var buttonAnim: UIButton!

    @IBAction func ClickOnButtonAnim(_ sender: UIButton) {    
        UIView.transition(with: buttonAnim, duration: 0.4, options: .transitionFlipFromLeft, animation: nil , completion: nil)
    }

}

このアニメーションでは、任意のui(ボタンまたはラベル、uiviewまたは画像)を使用できます。


1
回答としてリンクを投稿することはお勧めしません。リンクはいつか無効になる可能性があります。この方法が役立つと思われる場合は、ここに投稿していただけませんか。
クリストファー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.