2

J'ai une application qui permet à l'utilisateur de sélectionner une image à partir d'une caméra ou d'une photothèque. Il place ensuite cette image dans un ImageView. J'utilise ensuite Quartz pour saisir l'image de cette vue d'image et la restituer avec quelques superpositions de base, etc.Image d'étirement à quartz sélectionnée à partir de imagePickerController

Le problème est que lorsque l'image est prise sur l'appareil photo, ou à partir de l'appareil photo, Quartz dessine l'image avec une rotation de 90 degrés et étire l'image verticalement. Il n'y a aucun problème lors de la sélection d'une autre photo de la photothèque. Et le problème ne se produit pas si allowImageEditing est défini sur YES.

Si quelqu'un peut jeter de la lumière ce serait utile, je suis un débutant relative à cela.

code dans mon CameraViewController

#pragma mark - 
- (IBAction)getCameraPicture { 
    UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
    picker.navigationBar.barStyle = UIBarStyleBlackOpaque; 
    picker.delegate = self; 
    picker.allowsImageEditing = NO; //seems to fix the weird rotation & stretching issues if set to YES 
    picker.sourceType = UIImagePickerControllerSourceTypeCamera; 
    [self presentModalViewController:picker animated:YES]; 
    //[picker release]; 
} 
- (IBAction)selectExistingPicture { 
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { 
    UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
    picker.navigationBar.barStyle = UIBarStyleBlackOpaque; 
    picker.delegate = self; 
    picker.allowsImageEditing = NO; //seems to fix the weird rotation & stretching issues if set to YES (only with camera roll) 
    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
    [self presentModalViewController:picker animated:YES]; 
    //[picker release]; 
    } 
} 
#pragma mark - 
- (void)imagePickerController:(UIImagePickerController *)picker 
didFinishPickingImage:(UIImage *)image 
    editingInfo:(NSDictionary *)editingInfo { 

    imageView.image = image; 
    NSLog(@"imagePicker image size %.0f x %.0f", image.size.width, image.size.height); 
    [picker dismissModalViewControllerAnimated:YES]; 
    [picker release]; 
    [quartzContextView setNeedsDisplay]; 
    [self setUpAndRenderImage]; 

} 
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { 
    [picker dismissModalViewControllerAnimated:YES]; 
    [picker release]; 
} 

code dans la vue qui attire le quartz

NSLog(@"Quartz image size %.0f x %.0f", drawImageTwo.size.width, drawImageTwo.size.height); 
if (drawImageTwo.size.width >= drawImageTwo.size.height) 
{ 
    scaleFactor = (insideHeight+5)/drawImageTwo.size.height; 
    xOffset = (drawImageTwo.size.width*scaleFactor - insideWidth)/2; 
    yOffset = 0; 
    NSLog(@"Image is Landscaepe"); 
} 
else if (drawImageTwo.size.width < drawImageTwo.size.height) 
{ 
    scaleFactor = (insideWidth+5)/drawImageTwo.size.width; 
    yOffset = (drawImageTwo.size.height*scaleFactor - insideHeight)/2; 
    xOffset = 0; 
    NSLog(@"Image is Portrait"); 
} 

//draw Photo Base 
CGRect baseRect = CGRectMake(0.0, 0.0, width, height); 
CGContextDrawImage (context, baseRect, drawImage.CGImage); 

//clip all further drawing to context clip 
CGContextClipToRect(context, CGRectMake(leftOffset, (height-insideHeight-topOffset), insideWidth, insideHeight)); 

//draw Photo 
CGRect photoRect = CGRectMake(leftOffset-xOffset, (height-insideHeight-topOffset)-yOffset, drawImageTwo.size.width*scaleFactor, drawImageTwo.size.height*scaleFactor); 
CGContextDrawImage (context, photoRect, drawImageTwo.CGImage); 

Répondre

0

Le problème que vous rencontrez provient de différents systèmes de coordonnées et la gestion de l'orientation de l'image dans UIKit et CoreGraphics.

Un UIImage connaît son orientation, c'est-à-dire l'orientation de la caméra lors de la première prise de vue. Tant que vous travaillez avec les classes UIKit tout fonctionne comme prévu, mais lorsque vous obtenez l'image CGImage brute d'un UIImage vous perdez cette information. Vous devez rendre compte de l'orientation de l'image pour vous-même, en transformant la CTM (Current Transformation Matrix) du CGContext.

Mais pas assez CoreGraphics utilise un système de coordonnées dont l'origine se trouve dans le coin inférieur gauche de l'écran, alors que UIKit a son origine dans le coin supérieur gauche. Voir le Guide de programmation Quartz 2D, chapitre "Contextes graphiques". Vous devrez redimensionner le CTM par 0, -1 et le traduire par sa hauteur pour en tenir compte. Dans votre exemple, comme vous ne faites pas de fantaisie avec l'image, il semble plus approprié d'essayer la méthode UIImages drawInRect: qui prend déjà en compte les deux gotchas.

Questions connexes