iPhone — переворачивание UIImage

Я работаю над приложением, которое использует переднюю камеру 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 °, но это не работает по какой-то загадочной причине.

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


person Oliver    schedule 03.04.2011    source источник


Ответы (1)


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

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

Созданный вами CGAffineTransformMake представляет это. В принципе, для 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.

person kennytm    schedule 03.04.2011
comment
Треклятый. Хорошо, большое спасибо, но я действительно не понимаю ни слова :-) Думаю, мне нужно очень много работать, чтобы иметь возможность делать графику. Но вопрос: почему, если я использую CGContextRotateCTM (контекст, 3.14) в последней строке (или даже в первой), чтобы поместить изображение в исходный вид экрана, возвращается пустое/прозрачное изображение? - person Oliver; 04.04.2011