web-dev-qa-db-fra.com

Objectif C: Comment fixer le rapport d'aspect de l'image (et ne pas le modifier pour l'adapter au cadre de visualisation d'image)

J'utilise UIImagePickerController pour sélectionner des images pour mon application. Cependant, je suis confronté à certains défis en ce qui concerne le maintien du rapport d'aspect des images sélectionnées

Par exemple,

J'ai une image brute sur le téléphone comme suit (pas une image carrée):

enter image description here

Après avoir sélectionné l'image sur l'iphone via la page `` déplacer et mettre à l'échelle '' pour recadrer l'image, le résultat est le suivant: (le rapport d'aspect est toujours conservé ici)

enter image description here

Mon application affichera l'image sélectionnée dans une UIImageView avec un cadre carré (200 x 200). Après avoir défini l'image sélectionnée sur UIImageView (UIImageView.image = selectedImage), le rapport hauteur/largeur de l'image n'est pas conservé mais suit à la place le cadre de UIImageView: (L'image semble asymétrique maintenant dans mon UIImageView):

enter image description here

Y a-t-il un moyen de conserver le rapport hauteur/largeur de l'image dans ce cas?

EDIT: Mettre à jour le résultat attendu

Après réflexion, je me rends compte que la meilleure façon de résoudre mon problème est de m'assurer que pour de telles images (non carrées), je dois les "convertir" en images carrées, c'est-à-dire remplir les espaces vides en haut et en bas des images pour faire un carré par exemple.

Image attendue: (avec les bordures supérieure et inférieure ajoutées)

enter image description here

EDIT: mise à jour avec un exemple de code

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo 
{

    self.imageView.contentMode = UIViewContentModeScaleAspectFill;

    self.imageView.image = image;
    [[picker parentViewController] dismissModalViewControllerAnimated:YES];

    //Compress image
    UIImage *image = [self scaleImage:img toSize:CGSizeMake(612.0,612.0)];

    self.imageData = UIImageJPEGRepresentation(image, 0.75);
}

En ajoutant le code "self.imageView.contentMode = UIViewContentModeScaleAspectFill;", j'ai pu obtenir l'image carrée dans uiimageview

enter image description here

Mais il semble que l'image d'origine n'était toujours pas une image carrée, donc le problème d'inclinaison se produira toujours lorsque je fais "UIImage * image = [self scaleImage: img toSize: CGSizeMake (612.0,612.0)];". Mon hypothèse est-elle correcte? Quoi qu'il en soit, pour atténuer ce problème, car je devrai toujours afficher l'image "compressée" ailleurs dans l'application.

21
Zhen

Faire myImageView.contentMode = UIViewContentModeScaleAspectFit; n'est pas suffisant car il modifie le rapport hauteur/largeur de l'image comme Zhen le souhaite, mais il ne change pas l'image source, ce dont Zhen a besoin. La seule façon de le faire est d'utiliser le UIGraphicsImageContext comme expliqué ici: Redimensionner UIImage avec rapport d'aspect?

37
edo42

Vous devez ajuster le mode de contenu de votre UIImageView:

myImageView.contentMode = UIViewContentModeScaleAspectFit;

Juste pour les coups de pied - consultez la documentation sur les constantes UIViewContentMode.

23
Eimantas

Vous pouvez définir la propriété contentMode sur votre instance UIImageView, comme:

myImageView.contentMode = UIViewContentModeScaleAspectFit;

Cela la forcera à conserver les proportions de votre image lors de la mise à l'échelle. Il existe également un certain nombre d'autres valeurs que vous pouvez définir ici pour produire d'autres comportements, comme décrit dans documentation de référence .

7
aroth