Как перевернуть UIImage по горизонтали? - PullRequest
105 голосов
/ 23 марта 2011

Как перевернуть UIImage по горизонтали, я нашел значение перечисления UIImageOrientationUpMirrored в справочнике по классу UIImage, как использовать это свойство для переворота UIImage.

Ответы [ 18 ]

228 голосов
/ 23 марта 2011
UIImage* sourceImage = [UIImage imageNamed:@"whatever.png"];

UIImage* flippedImage = [UIImage imageWithCGImage:sourceImage.CGImage 
                                            scale:sourceImage.scale
                                      orientation:UIImageOrientationUpMirrored];
65 голосов
/ 30 декабря 2014

Очень простой способ добиться этого - создать UIImageView вместо UIImage и выполнить преобразование в UIImageView.

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

Надеюсь, это поможет.

35 голосов
/ 17 июля 2014

Для инициализации текстуры 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;
}
12 голосов
/ 26 ноября 2013

Как оно определяет ориентацию изображения:

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

Я сделал некоторые улучшения для большего количества обстоятельств, таких как обработка UIImage из AVCaptureSession.

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];
12 голосов
/ 21 октября 2015

Я попытался с imageFlippedForRightToLeftLayoutDirection и создал новый UIImage с различными ориентациями, но по крайней мере это единственное решение, которое я нашел для переворачивания моего изображения

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

Как вы можете видеть на моей детской площадке, это сработало !! :) enter image description here

И, конечно, пусть finalImage = UIImage (CIImage: rotada3)

9 голосов
/ 08 октября 2014

вот быстрая версия: (я видел этот вопрос в комментариях)

let srcImage = UIImage(named: "imageName")
let flippedImage = UIImage(CGImage: srcImage.CGImage, scale: srcImage.scale, orientation: UIImageOrientation.UpMirrored)
6 голосов
/ 23 марта 2017

Это солидная реализация для зеркального / зеркального отражения 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 голосов
/ 23 января 2014

Может быть, это будет полезно для некоторых:

    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 голосов
/ 15 декабря 2016

Для Swift 3/4:

imageView.transform = CGAffineTransform(scaleX: -1, y: 1)
3 голосов
/ 04 декабря 2017

iOS 10 +

[myImage imageWithHorizontallyFlippedOrientation];

Swift 4:

let flippedImage = myImage.withHorizontallyFlippedOrientation()
...