it-swarm.com.de

Ändern Sie die Größe von UIImage und ändern Sie die Größe von UIImageView

Ich habe dieses UIImageView und ich habe die Werte für seine maximale Höhe und maximale Breite. Was ich erreichen will ist, dass ich das Bild aufnehmen möchte (mit beliebigem Seitenverhältnis und beliebiger Auflösung) und ich möchte, dass es in die Ränder passt, damit das Bild sie nicht überschreitet sie aber es kann sie verkleinern es will. (im Bild rot markiert):

enter image description here

Im Moment passt das Bild richtig in die nötige Größe, aber ich habe zwei Sorgen: 1. UIImageView entspricht nicht der Größe des skalierten Bildes und hinterlässt somit einen roten Hintergrund (und ich möchte das nicht) 2. Wenn das Bild kleiner als die Höhe meines UIImageView ist, wird die Größe nicht geändert, damit es kleiner wird. Es bleibt jedoch dieselbe Höhe.

Hier ist mein Code und ich weiß, dass es falsch ist:

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;

Wie ändere ich also dynamisch die Größe nicht nur des UIImageView.image, sondern des gesamten UIImageView, so dass seine Größe vollständig an den Inhalt angepasst werden kann. Jede Hilfe wäre sehr dankbar, danke!

21

Wenn Sie die Breite und Höhe eines skalierten Bildes erhalten Breite eines skalierten Bildes nach UIViewContentModeScaleAspectFit abrufen, können Sie die Bildansicht ändern:

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

Ich habe nicht überprüft, ob es funktioniert, aber ich denke, alles sollte in Ordnung sein

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

Dies ist das schnelle Äquivalent für die Antwort von Rajneesh071, das Erweiterungen verwendet 

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
  }
}

Verwendungszweck:

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

Verwenden Sie die unten stehende Kategorie und wenden Sie dann den Rand von Quarz in Ihr Bild an:

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

Die Kategorie: 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

Wenn Sie die Größe des Bildes haben, warum setzen Sie den frame.size der Bildansicht nicht auf diese Größe?

BEARBEITEN----

Ok, da ich deinen Kommentar sehe, schlage ich Folgendes vor:

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
}

Durch diesen Code wird die Bildansicht an das Bildverhältnis angepasst und die Bildansicht in der Mitte der "Standardposition" positioniert.

PS: Ich hoffe, Sie setzen imageView.layer.shouldRasterise = YES Und imageView.layer.rasterizationScale = [UIScreen mainScreen].scale;

wenn Sie den CALayer-Schatteneffekt verwenden;) Dadurch wird die Leistung Ihrer Benutzeroberfläche erheblich verbessert.

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

Ich denke, was Sie wollen, ist ein anderer content mode. Versuchen Sie es mit UIViewContentModeScaleToFill. Dadurch wird der Inhalt an die Größe Ihres UIImageView angepasst, indem das Seitenverhältnis des Inhalts bei Bedarf geändert wird.

Schauen Sie sich den Abschnitt content mode des offiziellen Dokuments an, um einen besseren Überblick über die verschiedenen verfügbaren Inhaltsmodi zu erhalten (dies wird mit Bildern veranschaulicht).

0
tiguero