IPhone - зеркальное отображение снимка с передней камеры
При использовании передней камеры 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();
Но это просто дает черное изображение.
Ответы
Ответ 1
Лучший способ - сделать изображение в новом контексте.
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);
Это было записано из памяти и без помощи компилятора, пожалуйста, не копируйте и не вставляйте...
Ответ 2
- (void)didTakePicture:(UIImage *)picture
{
UIImage * flippedImage = [UIImage imageWithCGImage:picture.CGImage scale:picture.scale orientation:UIImageOrientationLeftMirrored];
picture = flippedImage;
}
Ответ 3
Я знаю, что на этот вопрос уже был дан ответ, но ответ выше не работал у меня, так что если есть другие...
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 - это ваше новое изображение с ориентацией вверх
Ответ 4
Ответ Andrew Park отлично работает. Это версия 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
}
Ответ 5
Возможно, вам захочется зеркально отобразить изображение, которое вы получаете с камеры, но то, что вы изначально получили, является правильным. Сделайте снимок с текстом для сравнения.
Ответ 6
Как и другие ответы, у меня была та же проблема. Но просто перевернуть окончательное изображение - это только половина ответа, потому что изображение предварительного просмотра, отображаемое UIPickerController при съемке с передней камерой, оно все еще инвертировано (зеркально).
На основе некоторых кодов из Интернета я создал Pod, чтобы получить это желаемое поведение:
https://github.com/lucasecf/LEMirroredImagePicker
После установки вам просто нужно вызвать эти две строки кода вместе с вашим UIImagePickerController
:
self.mirrorFrontPicker = [[LEMirroredImagePicker alloc] initWithImagePicker:pickerController];
[self.mirrorFrontPicker mirrorFrontCamera];
И это все, просто так. Вы можете проверить дополнительную информацию в README ссылки github.
Ответ 7
Немного более простой ответ, обновленный для 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
}
Ответ 8
Я бы хотел проголосовать @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];
}