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):
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)
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):
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)
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
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.
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?
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
.
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 .