web-dev-qa-db-fra.com

Redimensionner UIImage et changer la taille de UIImageView

J'ai cette UIImageView et j'ai les valeurs de sa hauteur maximale et de sa largeur maximale. Ce que je veux réaliser, c’est que je veux prendre l’image (quel que soit le format et la résolution) et que je souhaite l’adapter aux limites, de sorte que l’image ne les dépasse pas eux, mais elle peut les réduire ça veut. (marqué en rouge dans l'image):

enter image description here

Pour l’instant, l’image prend correctement la taille requise, mais j’ai 2 soucis: 1. La UIImageView n’est pas égale à la taille de l’image redimensionnée, ce qui laisse un arrière-plan rouge (et je ne le veux pas) 2. Si l’image est plus petite que la hauteur de ma UIImageView ne soit pas redimensionnée pour être plus petite, elle reste à la même hauteur.

Voici mon code et je sais que c'est faux:

UIImage *actualImage = [attachmentsArray lastObject];
UIImageView *attachmentImageNew = [[UIImageView alloc] initWithFrame:CGRectMake(5.5, 6.5, 245, 134)];
attachmentImageNew.image = actualImage;
attachmentImageNew.backgroundColor = [UIColor redColor];
attachmentImageNew.contentMode = UIViewContentModeScaleAspectFit;

Alors, comment puis-je changer dynamiquement la taille non seulement du UIImageView.image, mais de l’ensemble UIImageView, rendant ainsi sa taille totalement ajustable à son contenu. Toute aide serait très appréciée, merci!

21
Sergey Grischyov

Lorsque vous obtenez la largeur et la hauteur d'une image redimensionnée Obtenez la largeur d'une image redimensionnée après UIViewContentModeScaleAspectFit , vous pouvez redimensionner votre imageView:

imageView.frame = CGRectMake(0, 0, resizedWidth, resizedHeight);
imageView.center = imageView.superview.center;

Je n'ai pas vérifié si cela fonctionnait, mais je pense que tout devrait bien se passer

31
Mikhail
- (UIImage *)image:(UIImage*)originalImage scaledToSize:(CGSize)size
{
    //avoid redundant drawing
    if (CGSizeEqualToSize(originalImage.size, size))
    {
        return originalImage;
    }

    //create drawing context
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);

    //draw
    [originalImage drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)];

    //capture resultant image
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    //return image
    return image;
}
23
Rajneesh071

C’est l’équivalent Swift de la réponse de Rajneesh071, en utilisant des extensions 

UIImage {
  func scaleToSize(aSize :CGSize) -> UIImage {
    if (CGSizeEqualToSize(self.size, aSize)) {
      return self
    }

    UIGraphicsBeginImageContextWithOptions(aSize, false, 0.0)
    self.drawInRect(CGRectMake(0.0, 0.0, aSize.width, aSize.height))
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
  }
}

Usage:

let image = UIImage(named: "Icon")
item.icon = image?.scaleToSize(CGSize(width: 30.0, height: 30.0))
7
JoeGalind

Utilisez la catégorie ci-dessous puis appliquez la bordure de Quartz à votre image:

[yourimage.layer setBorderColor:[[UIColor whiteColor] CGColor]];
[yourimage.layer setBorderWidth:2];

La catégorie: UIImage + AutoScaleResize.h

#import <Foundation/Foundation.h>

@interface UIImage (AutoScaleResize)

- (UIImage *)imageByScalingAndCroppingForSize:(CGSize)targetSize;

@end

UIImage + AutoScaleResize.m

#import "UIImage+AutoScaleResize.h"

@implementation UIImage (AutoScaleResize)

- (UIImage *)imageByScalingAndCroppingForSize:(CGSize)targetSize
{
    UIImage *sourceImage = self;
    UIImage *newImage = nil;
    CGSize imageSize = sourceImage.size;
    CGFloat width = imageSize.width;
    CGFloat height = imageSize.height;
    CGFloat targetWidth = targetSize.width;
    CGFloat targetHeight = targetSize.height;
    CGFloat scaleFactor = 0.0;
    CGFloat scaledWidth = targetWidth;
    CGFloat scaledHeight = targetHeight;
    CGPoint thumbnailPoint = CGPointMake(0.0,0.0);

    if (CGSizeEqualToSize(imageSize, targetSize) == NO)
    {
        CGFloat widthFactor = targetWidth / width;
        CGFloat heightFactor = targetHeight / height;

        if (widthFactor > heightFactor)
        {
            scaleFactor = widthFactor; // scale to fit height
        }
        else
        {
            scaleFactor = heightFactor; // scale to fit width
        }

        scaledWidth  = width * scaleFactor;
        scaledHeight = height * scaleFactor;

        // center the image
        if (widthFactor > heightFactor)
        {
            thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
        }
        else
        {
            if (widthFactor < heightFactor)
            {
                thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
            }
        }
    }

    UIGraphicsBeginImageContext(targetSize); // this will crop

    CGRect thumbnailRect = CGRectZero;
    thumbnailRect.Origin = thumbnailPoint;
    thumbnailRect.size.width  = scaledWidth;
    thumbnailRect.size.height = scaledHeight;

    [sourceImage drawInRect:thumbnailRect];

    newImage = UIGraphicsGetImageFromCurrentImageContext();

    if(newImage == nil)
    {
        NSLog(@"could not scale image");
    }

    //pop the context to get back to the default
    UIGraphicsEndImageContext();

    return newImage;
}

@end
4
CainaSouza

Si vous avez la taille de l'image, pourquoi ne définissez-vous pas le frame.size de la vue d'image sur cette taille?

MODIFIER----

Ok, donc en voyant ton commentaire je propose ceci:

UIImageView *imageView;
//so let's say you're image view size is set to the maximum size you want

CGFloat maxWidth = imageView.frame.size.width;
CGFloat maxHeight = imageView.frame.size.height;

CGFloat viewRatio = maxWidth / maxHeight;
CGFloat imageRatio = image.size.height / image.size.width;

if (imageRatio > viewRatio) {
    CGFloat imageViewHeight = round(maxWidth * imageRatio);
    imageView.frame = CGRectMake(0, ceil((self.bounds.size.height - imageViewHeight) / 2.f), maxWidth, imageViewHeight);
}
else if (imageRatio < viewRatio) {
    CGFloat imageViewWidth = roundf(maxHeight / imageRatio);
    imageView.frame = CGRectMake(ceil((maxWidth - imageViewWidth) / 2.f), 0, imageViewWidth, maxHeight);
} else {
    //your image view is already at the good size
}

Ce code redimensionnera votre affichage d'image à son rapport d'image et le positionnera au même centre que votre position "par défaut".

PS: J'espère que vous définissez imageView.layer.shouldRasterise = YES Et imageView.layer.rasterizationScale = [UIScreen mainScreen].scale;

si vous utilisez l'effet d'ombre CALayer;), cela améliorera considérablement les performances de votre interface utilisateur.

1
Baldoph
   if([[SDWebImageManager sharedManager] diskImageExistsForURL:[NSURL URLWithString:@"URL STRING1"]])
   {
       NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:[NSURL URLWithString:@"URL STRING1"]];

       UIImage *tempImage=[self imageWithImage:[[SDImageCache sharedImageCache] imageFromDiskCacheForKey:key] scaledToWidth:cell.imgview.bounds.size.width];
       cell.imgview.image=tempImage;

   }
   else
   {
       [cell.imgview sd_setImageWithURL:[NSURL URLWithString:@"URL STRING1"] placeholderImage:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL)
        {
            UIImage *tempImage=[self imageWithImage:image scaledToWidth:cell.imgview.bounds.size.width];
            cell.imgview.image=tempImage;
//                [tableView beginUpdates];
//                [tableView endUpdates];

        }];
   }
0
Gami Nilesh

Je pense que ce que vous voulez, c'est un content mode différent. Essayez d’utiliser UIViewContentModeScaleToFill. Cela redimensionnera le contenu pour l'adapter à la taille de votre UIImageView en modifiant le format du contenu si nécessaire.

Consultez la section content mode de la documentation officielle pour avoir une meilleure idée des différents modes de contenu disponibles (il est illustré par des images).

0
tiguero