J'ai vu dans de nombreux articles pour redimensionner l'image en conservant les proportions. Ces fonctions utilisent les points fixes (largeur et hauteur) pour RECT lors du redimensionnement. Mais dans mon projet, je dois redimensionner la vue en fonction de la largeur uniquement. La hauteur doit être prise automatiquement en fonction du rapport de format. quiconque m'aide à atteindre cet objectif.
Réponses
Trop de publicités?La méthode de Srikar fonctionne très bien si vous connaissez la hauteur et la largeur de votre nouvelle taille. Si, par exemple, vous ne connaissez que la largeur à laquelle vous souhaitez vous adapter et que vous vous moquez de la hauteur, vous devez d'abord calculer le facteur d'échelle de la hauteur.
+(UIImage*)imageWithImage: (UIImage*) sourceImage scaledToWidth: (float) i_width
{
float oldWidth = sourceImage.size.width;
float scaleFactor = i_width / oldWidth;
float newHeight = sourceImage.size.height * scaleFactor;
float newWidth = oldWidth * scaleFactor;
UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight));
[sourceImage drawInRect:CGRectMake(0, 0, newWidth, newHeight)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
Si vous ne savez pas si l'image sera au format portrait ou paysage (par exemple, l'utilisateur prend une photo avec l'appareil photo), j'ai créé une autre méthode prenant en compte les paramètres de largeur et de hauteur maximum.
Disons que vous avez un UIImage *myLargeImage
qui est un ratio de 4: 3.
UIImage *myResizedImage = [ImageUtilities imageWithImage:myLargeImage
scaledToMaxWidth:1024
maxHeight:1024];
Le UIImage redimensionné sera 1024x768 si paysage; 768x1024 si portrait. Cette méthode générera également des images de résolution supérieure pour l'affichage de la rétine.
+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)size {
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
UIGraphicsBeginImageContextWithOptions(size, NO, [[UIScreen mainScreen] scale]);
} else {
UIGraphicsBeginImageContext(size);
}
[image drawInRect:CGRectMake(0, 0, size.width, size.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
+ (UIImage *)imageWithImage:(UIImage *)image scaledToMaxWidth:(CGFloat)width maxHeight:(CGFloat)height {
CGFloat oldWidth = image.size.width;
CGFloat oldHeight = image.size.height;
CGFloat scaleFactor = (oldWidth > oldHeight) ? width / oldWidth : height / oldHeight;
CGFloat newHeight = oldHeight * scaleFactor;
CGFloat newWidth = oldWidth * scaleFactor;
CGSize newSize = CGSizeMake(newWidth, newHeight);
return [self imageWithImage:image scaledToSize:newSize];
}
La méthode la plus simple consiste à définir le cadre de votre UIImageView
et à définir le contentMode
sur l’une des options de redimensionnement.
Le code va comme ceci - Cela peut être utilisé comme une méthode utilitaire -
+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize
{
UIGraphicsBeginImageContext(newSize);
[image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
Pour améliorer la réponse de Ryan:
+ (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)size {
CGFloat oldWidth = image.size.width;
CGFloat oldHeight = image.size.height;
//You may need to take some retina adjustments into consideration here
CGFloat scaleFactor = (oldWidth > oldHeight) ? width / oldWidth : height / oldHeight;
return [UIImage imageWithCGImage:image.CGImage scale:scaleFactor orientation:UIImageOrientationUp];
}