UIImage를 수평으로 뒤집는 방법?


111

UIImage수평 으로 뒤집는 방법 UIImageOrientationUpMirrored, UIImage클래스 참조 에서 열거 형 값을 찾았습니다 UIImage. 이 속성을 사용하여 뒤집는 방법 .


aroth의 훌륭한 답변에 추가하려면, 애플은 이미지 방향의 다른 종류의 잘에서 설명 이 링크
코코

수락 된 항목이 나를 위해 작동하지 않았기 때문에이 카테고리를 찾았습니다 . 매력처럼 작동합니다.
dwbrito

답변:


238

목표 -C

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

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

빠른

let flippedImage = myImage.withHorizontallyFlippedOrientation()

14
이 답변에는 두 가지 문제가 있습니다. 레티 나 호환 이미지에서 스케일이 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 2014-07-25

3
내가하려고 할 때 이것은 완전히 깨지는 것 같습니다 [flippedImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]. 왜 그런지 아세요?
devios1

70

이를 달성 할 수있는 매우 간단한 방법은 UIImage 대신 UIImageView를 만들고 UIImageView에서 변환을 수행하는 것입니다.

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

도움이 되었기를 바랍니다.


2
이것은 렌더링 모드 UIImage와 결합했을 때 부작용이 있다는 것을 알게 된 조작 보다 훨씬 더 잘 작동했습니다 UIImageRenderingModeAlwaysTemplate.
devios1

2
공유 해주셔서 감사합니다. 이 게시물과 관련된이 퍼즐에 대한 "답변"에 운이 없었지만 귀하의 답변은 놀랍도록 잘 작동했으며 코드 한 줄에 불과했습니다.
Adrian

잘 작동합니다! 이제 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

이것을 사용하여 이미지를 수직으로 뒤집는 방법이 있습니까?
Praxiteles

이 방법은 잘 또한 이미지 렌더링을 지원합니다 - 항상 템플릿을
피터 Stajger에게

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)

8

iOS 10 이상

[myImage imageWithHorizontallyFlippedOrientation];

스위프트 4 :

let flippedImage = myImage.withHorizontallyFlippedOrientation()

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];

5

Swift 3/4의 경우 :

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

이것은있는 UIImageView를 들어, 영업 이익은있는 UIImage을 찾고있다
Shizam

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의 최고의 기능 중 하나입니다. 위의 원래 답변이 권장하지 않은 것에 놀랐습니다.이 버전이 훨씬 더 좋습니다.
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

1
예, 맞습니다. 제 경우에는 RTL 지원을위한 것이 었습니다. 우리는 모두 SO의 코드가 참조 용이라는 것을 알고 있으며 사람들은 먼저 이해하지 않고 복사 / 붙여 넣기 만하지 않습니다.
capikaw

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

위의 답변 중 하나가 수정되었으며 Swift 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 dec.

1
또한 OPs 질문에는 이미지를 뒤집을 것을 요청하므로 이것은 작동하지 않습니다. 여기에있는 코드는 이미지보기를 뒤집습니다. 둘 다 어디에서 사용할 수 있는지가 매우 다릅니다. 예를 들어 버튼은 이미지보기가 아닌 이미지를 가져옵니다.
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

스위프트 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
답변으로 링크를 게시하지 않는 것이 좋습니다. 링크는 언젠가 무효화 될 수 있습니다. 방법이 도움이된다고 생각되면 여기에 게시 해 주시겠습니까?
Christopher
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.