iPhone - зеркальное отражение снимка, сделанного с передней камеры - PullRequest
10 голосов
/ 31 марта 2011

При использовании передней камеры iPhone 4 для съемки снимок зеркально отображается по сравнению с тем, что вы видите на экране iPhone. Как я могу восстановить «экранное» представление UIImage (не UIImageView) и иметь возможность сохранить его следующим образом?

Я пытался:

UIImage* transformedImage = [UIImage imageWithCGImage:pickedImage.CGImage scale:1.0 orientation:UIImageOrientationLeftMirrored];
UIImageWriteToSavedPhotosAlbum (transformedImage, self, @selector(photoSaved:didFinishSavingWithError:contextInfo:), nil);

затем вывести его на экран. Он почти такой же, как на экране, но сохраненное изображение искажено.

Итак ... Как я могу восстановить «экранное» представление UIImage (не UIImageView) и иметь возможность сохранить его следующим образом?

Я тоже пробовал так:

UIImage* pickedImage = [[info objectForKey:UIImagePickerControllerOriginalImage] retain];
UIImage* transformedImage;

CGSize imageSize = pickedImage.size;
UIGraphicsBeginImageContextWithOptions(imageSize, YES, 1.0);
GContextRef ctx = UIGraphicsGetCurrentContext();

CGContextRotateCTM(ctx, 3.14);  // rotate by 180°
CGContextScaleCTM(ctx, 1.0, -1.0); // flip vertical
CGContextDrawImage(ctx, CGRectMake(0.0, 0.0, imageSize.width, imageSize.height), pickedImage.CGImage);
transformedImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

Но это просто дает черное изображение.

Ответы [ 8 ]

27 голосов
/ 10 мая 2011
- (void)didTakePicture:(UIImage *)picture
{
    UIImage * flippedImage = [UIImage imageWithCGImage:picture.CGImage scale:picture.scale orientation:UIImageOrientationLeftMirrored];
    picture = flippedImage;
}
9 голосов
/ 26 февраля 2012

Я знаю, что на этот вопрос уже был дан ответ, но ответ выше не сработал для меня, поэтому, если есть другие ...

UIImage *theImage = [info objectForKey:UIImagePickerControllerOriginalImage];
    if (picker.cameraDevice == UIImagePickerControllerCameraDeviceFront) {
        CGSize imageSize = theImage.size;
        UIGraphicsBeginImageContextWithOptions(imageSize, YES, 1.0);
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        CGContextRotateCTM(ctx, M_PI/2);
        CGContextTranslateCTM(ctx, 0, -imageSize.width);
        CGContextScaleCTM(ctx, imageSize.height/imageSize.width, imageSize.width/imageSize.height);
        CGContextDrawImage(ctx, CGRectMake(0.0, 0.0, imageSize.width, imageSize.height), theImage.CGImage);
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }

и newImage - это ваше новое изображение с ориентацией вверх

6 голосов
/ 01 апреля 2011

Лучший способ - нарисовать изображение в новом контексте.

CGSize imageSize = pickedImage.size;
UIGraphicsBeginImageContextWithOptions(imageSize, YES, 1.0);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(ctx, imageSize.width, 0.0);
CGContextScaleCTM(ctx, -1.0, 1.0);
CGContextDrawImage(ctx, pickedImage.CGImage, CGRectMake(0.0, 0.0, imageSize.width, imageSize.height));
UIImage *transformedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum (transformedImage, self, @selector(photoSaved:didFinishSavingWithError:contextInfo:), nil);

Это было записано из памяти и без помощи компилятора, пожалуйста, не копируйте и не вставляйте ...

5 голосов
/ 17 января 2016

Эндрю Парк прекрасно работает. Это версия Swift.

func flipImage(image: UIImage!) -> UIImage! {
    let imageSize:CGSize = image.size;
    UIGraphicsBeginImageContextWithOptions(imageSize, true, 1.0);
    let ctx:CGContextRef = UIGraphicsGetCurrentContext()!;
    CGContextRotateCTM(ctx, CGFloat(M_PI/2.0));
    CGContextTranslateCTM(ctx, 0, -imageSize.width);
    CGContextScaleCTM(ctx, imageSize.height/imageSize.width, imageSize.width/imageSize.height);
    CGContextDrawImage(ctx, CGRectMake(0.0, 0.0, imageSize.width, imageSize.height), image.CGImage);
    let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage
}
4 голосов
/ 20 сентября 2016

Обновлен немного более простой ответ для Swift 3:

func flipImage(image: UIImage) -> UIImage {
    guard let cgImage = image.cgImage else {
        // Could not form CGImage from UIImage for some reason.
        // Return unflipped image
        return image
    }
    let flippedImage = UIImage(cgImage: cgImage, 
                               scale: image.scale, 
                               orientation: .leftMirrored)
    return flippedImage
}
4 голосов
/ 15 января 2013

Возможно, вы захотите отразить изображение, полученное с камеры, но то, что вы изначально получили, правильно. Сфотографируйте с текстом для сравнения.

3 голосов
/ 21 июля 2013

Как и другие ответы, у меня была такая же проблема. Но просто перевернуть окончательное изображение - это только половина ответа, потому что предварительное изображение, отображаемое UIPickerController при съемке с помощью передней камеры, по-прежнему инвертируется (отражается).

На основе некоторых кодов из Интернета я создал Pod, чтобы получить желаемое поведение:

https://github.com/lucasecf/LEMirroredImagePicker

После установки вам просто нужно вызвать эти две строки кода вместе с вашим UIImagePickerController:

self.mirrorFrontPicker = [[LEMirroredImagePicker alloc] initWithImagePicker:pickerController];
[self.mirrorFrontPicker mirrorFrontCamera];

И это все, просто так. Вы можете проверить дополнительную информацию в README по ссылке на github.

0 голосов
/ 08 июля 2015

Я бы хотел проголосовать @Lucas Eduardo, я попытался интегрировать компонент LEImagePickerController в мой проект, как показано ниже:

- (void)onCamera:(id)sender {
    UIImagePickerController* imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
    imagePicker.cameraDevice = UIImagePickerControllerCameraDeviceFront;
    imagePicker.delegate = self;

    //cover the switch button at the top right corner, I just need user take photo with the front facing camera
    UIView* view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
    view.center = CGPointMake(CGRectGetWidth(imagePicker.view.bounds) - CGRectGetWidth(view.bounds)/2, CGRectGetHeight(view.bounds)/2);
    view.backgroundColor = [UIColor blackColor];
    [imagePicker.view addSubview:view];

    LEMirroredImagePicker* mirrorFrontPicker = [[LEMirroredImagePicker alloc] initWithImagePicker:imagePicker];
    [mirrorFrontPicker mirrorFrontCamera];

    [self presentViewController:imagePicker animated:YES completion:nil];
}
...