Redimensionner UIImage et changer la taille de UIImageView

j'ai ce 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 profiter de l'image (avec un aspect ratio et de toute résolution) et je veux qu'il fit dans les frontières de l'image ne pas dépasser , mais il peut rétrécir comme il veut. (marqué en rouge sur l'image):

enter image description here

en ce moment l'image s'adapte à la taille nécessaire correctement, mais j'ai 2 soucis: 1. Le UIImageView n'est pas égal à la taille de l'image redimensionnée, laissant ainsi le fond rouge (et je ne veux pas que) 2. Si l'image est plus petite que la hauteur de mon UIImageView il n'est pas redimensionnée pour être plus petit, il 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 changer dynamiquement la taille non seulement du UIImageView.image , mais de l'ensemble UIImageView , faisant ainsi sa taille totalement réglable à son contenu. Toute aide serait très appréciée, merci!

21
demandé sur Sergey Grischyov 2013-02-01 19:17:04

7 réponses

lorsque vous obtenez la largeur et la hauteur d'une image redimensionnée obtenir 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 ça marchait, mais je pense que tout devrait aller bien

31
répondu Mikhail 2017-05-23 12:32:12
- (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
répondu Rajneesh071 2013-10-18 14:32:35

C'est L'équivalent Swift pour 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
  }
}

Utilisation:

let image = UIImage(named: "Icon")
item.icon = image?.scaleToSize(CGSize(width: 30.0, height: 30.0))
7
répondu JoeGalind 2016-08-20 03:08:56

utilisez la catégorie ci-dessous et appliquez bordure de Quartz dans 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
répondu CainaSouza 2013-02-01 17:19:50

Si vous avez la taille de l'image, pourquoi ne pas vous fixer le frame.size de l'affichage de l'image de cette taille?

EDIT - - - -

Ok, donc en voyant votre commentaire je vous 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 va redimensionner votre vue d'image à son ratio d'image, et aussi positionner la vue d'image au même centre que votre position" par défaut".

PS: j'espère que vous êtes paramètre imageView.layer.shouldRasterise = YES et imageView.layer.rasterizationScale = [UIScreen mainScreen].scale;

si vous utilisez L'effet d'ombre CALayer ;) il améliorera grandement les performances de votre interface utilisateur.

1
répondu Baldoph 2013-02-01 15:44:11

je pense que ce que vous voulez est un autre content mode . Essayez d'utiliser UIViewContentModeScaleToFill . Cela permettra d'adapter le contenu à la taille de ur UIImageView en changeant le format du contenu si nécessaire.

regardez la section content mode sur le doc officiel pour avoir une meilleure idée des différents modes de contenu disponibles (il est illustré avec des images).

0
répondu tiguero 2013-02-01 15:43:31
   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
répondu Gami Nilesh 2017-01-23 12:10:13