Lorsque vous utilisez la caméra avant de l'iPhone 4 pour prendre une photo, la photo prise est reflétée par rapport à ce que vous voyez sur l'écran de l'iPhone. Comment puis-je restaurer la vue "à l'écran" de l'uiimage (pas l'UIImageView), et être capable de l'enregistrer comme ceci?
J'ai essayé: p>
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 Réponses :
Le meilleur moyen est de dessiner l'image dans un nouveau contexte.
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);
@Bill Dudney: Ugraphicsbeginimagecontextextextextes ne renvoie pas un contexte; Comment le configurez-vous? et cgcontextDrawImage a besoin d'un rect. J'ai l'asusme, je dois le faire avec 0, 0 et Imagezize?
Mis à jour avec un nouveau code amélioré, encore plus susceptible de fonctionner. Vous n'avez pas copié et coller avez-vous? Vous lisez les docs et vous l'avez écrit vous-même? :)
@Bill Dudney :-) J'avais copié / coller, mais cela devait comprendre plus facilement ce qu'il est sur le point de vue sur Xcode (avec des liens vers la déclaration de méthode / fonctions, de l'aide, de la ...). Je lis toujours le doc :-)
@Bill Dudney: Wow, il y a quelque chose que je ne comprends pas. L'image est reflétée (axe x) et tournée de 90 ° à droite et est rendue déformée. Les valeurs X et Y de la taille semble être inverse ... Je ne vois pas ce qui rend l'image pivoter. Pensez-vous qu'il pourrait y avoir un conflit avec Image Exifs?
Pourquoi utilisez-vous CGContextTranslatectM?
@Bill Dudney: Je ne vois vraiment pas pourquoi l'image tourne ... J'ai essayé une autre façon de le faire, appelant d'abord CGContexTrotatectM puis cgcontextscalectm, mais ce n'est toujours pas bon. Ou ça devrait être bon. Si vous faites pivoter de 180 °, puis verticaly inverse une image hmirrée, vous devriez récupérer l'image d'origine ...
La combinaison Traduire et Échelle déplace l'origine vers la droite au lieu de la gauche. Modifiez votre question ci-dessus avec votre code actuel et je vais essayer de jeter un oeil plus tard aujourd'hui.
- (void)didTakePicture:(UIImage *)picture { UIImage * flippedImage = [UIImage imageWithCGImage:picture.CGImage scale:picture.scale orientation:UIImageOrientationLeftMirrored]; picture = flippedImage; }
Ce n'est pas réel miroir
Cela ne fonctionne pas toujours: si vous instanciez UIImage sans afficher dans UiImageView, il n'a pas de CCIMAGE à fournir.
Je sais que cette question a déjà été répondue, mais la réponse ci-dessus n'a pas fonctionné pour moi, donc au cas où il y en a d'autres ... et NewImage est votre nouvelle image avec le haut Orientation p> p>
Vous voudrez peut-être refléter l'image que vous obtenez de la caméra, mais ce que vous obtenez à l'origine est correct. Prenez une photo avec du texte à comparer. P>
Comme les autres réponses, j'ai eu le même problème. Mais juste basculer l'image finale n'est que la moitié de la réponse, car l'image de prévisualisation, affichée par Uipickercontroller lorsque vous prenez une photo avec la caméra avant, elle est toujours inversée (miroir).
Basé dans certains codes d'Internet, j'ai créé Un pod pour obtenir ce comportement recherché: p>
Hey LeimagePickerController ne semble pas fonctionner, l'aperçu est toujours en miroir (iOS7, iPhone 4S)
Salut! Le code précédent était assez vieux. Maintenant, j'ai créé un POD et mis à jour le code pour fonctionner avec de nouvelles versions de iOS. Vous pouvez vérifier à nouveau le projet dans Github, si vous voulez.
Vient de l'essayer. Ça marche génial! (Essayé avec iOS 8.3, Swift et XCode 6.3.1) Je suis d'accord que la nouvelle image finale ne semble pas être une bonne expérience utilisateur. Merci de créer ledmirRoredimagePicker! Vraiment facile à utiliser!
Très facile à utiliser, mais vraiment le résultat final est toujours en miroir. Vous venez d'inverser l'affichage de la caméra pour commencer. Donc, si je prends un selfie par exemple, il se sent très étrange. Serait bien s'il y avait un moyen de simplement ne pas inverser l'aperçu. Toujours une podite cool cependant!
J'aimerais voter sur @LUCAS EDUARDO, j'ai essayé d'intégrer le composant LeImagePickerController dans mon projet comme ci-dessous:
- (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]; }
La réponse d'Andrew Park fonctionne bien. C'est une version 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 }
Une réponse légèrement plus simple mise à jour pour 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 }
Un uiimage n'aura pas d'équivalent CCIMAGE dans de nombreux cas, il est donc souvent inutile.
Je cherchais une solution qui retournerait l'image de prévisualisation de la caméra avant. Cela a travaillé à l'intérieur de la méthode de PhotoOutput.