iPhone - переворачивание UIImage - PullRequest
2 голосов
/ 04 апреля 2011

Я работаю над приложением, которое использует фронтальную камеру iPhone.Когда изображение снято с помощью этой камеры, оно горизонтально переворачивается iPhone.Я хочу отразить его обратно, чтобы иметь возможность сохранить его и отобразить так, как это было видно на экране iPhone.

Я прочитал много документов и множество советов в сети, и я 'Я все еще в замешательстве.

После моих исследований и многочисленных попыток я нашел решение, которое работает как для сохранения, так и для отображения:

- (UIImage *) flipImageLeftRight:(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();
    flipedImage = [UIImage imageWithCGImage:flipedImage.CGImage scale:1.0 orientation:UIImageOrientationDown];
    UIGraphicsEndImageContext();

    [tempImageView release];

    return flipedImage;
}

Но это слепое использование, и я нене понимаю, что сделано.

Я пытался использовать 2 imageWithCGImage, чтобы отразить его, а затем повернуть на 180 °, но это не сработало по какой-то таинственной причине.

Так что мой вопрос: Не могли бы вы помочь мне написать оптимизированный метод, который работает и который я смог бы понять, как он работает . Матрица - это черная дыра для меня ...

1 Ответ

10 голосов
/ 04 апреля 2011

Если эта матрица слишком загадочная, возможно, разделение ее на два этапа облегчает понимание:

CGContextRef context = UIGraphicsGetCurrentContext();

CGContextTranslateCTM(context, 0, tempImageView.frame.size.height);
CGContextScaleCTM(context, 1, -1);

[tempImageView.layer renderInContext:context];

Матрицы преобразования применяются от первого к последнему.Сначала холст перемещается вверх, а затем все координаты y изображения отменяются:

            +----+
            |    |
            | A  |
+----+      o----+     o----+
|    |                 | ∀  |
| A  | -->         --> |    |
o----+                 +----+

      x=x         x=x
      y=y+h       y=-y

Две формулы, которые изменяют координаты, можно объединить в одну:

 x = x
 y = -y + h

Сделанное вами CGAffineTransform делает это.По сути, для CGAffineTransformMake(a,b,c,d,e,f) это соответствует

x = a*x + c*y + e
y = b*x + d*y + f

См. http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_affine/dq_affine.html для получения дополнительной информации о 2D аффинном преобразовании в Core Graphics.

...