[FIXED] Ändern der Größe von UIImage auf die schnellste und effizienteste Weise

Ausgabe

Ich wollte ein UIImage auf eine bestimmte Breite und Höhe skalieren, um die Proportionen beizubehalten. Der einfachste Weg, dies zu tun, ist:

 CGSize newSize = CGSizeMake(726, 521);
    UIGraphicsBeginImageContext(newSize);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage * newImage = UIGraphicsGetImageFromCurrentImageContext();    
    UIGraphicsEndImageContext();

Hat die obige Methode Nachteile in Bezug auf Bildqualität und Zeitaufwand? Was ist ein besserer Weg als die obige Methode?

BEARBEITET:

Wie wäre es mit diesem:

- (UIImage *)imageByScalingProportionallyToSize:(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;
        else
            scaleFactor = heightFactor;

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


    // this is actually the interesting part:

    UIGraphicsBeginImageContext(targetSize);

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

    [sourceImage drawInRect:thumbnailRect];

    newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

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


    return newImage ;
}

Lösung

In einer Leistungsprobe von Image Resizing Techniques war die Punktzahl

  • 0,1420 UIKit
  • 0,1722 Core-Grafik
  • 0,1616 Bild-E/A
  • 2,4983 Kernbild
  • 2.3126 vImage

Also der schnellste und einfachste Weg ist:


let renderer = UIGraphicsImageRenderer(size: size)
let resized = renderer.image { (context) in
    image.draw(in: CGRect(origin: .zero, size: size))
}

Resize a UIImage the right way stammt aus dem Jahr 2009, enthält aber nützliche Gespräche über die Interpolationsqualität und die Beibehaltung des Seitenverhältnisses.


Um das Verhältnis innerhalb einer maximalen Größe beizubehalten:

let image: UIImage = ...
let maxSize = CGSize(width: 726, height: 521)
let newSize = AVMakeRect(aspectRatio: image.size, insideRect: CGRect(origin: .zero, size: maxSize)).size
let resized = UIGraphicsImageRenderer(size: newSize).image { _ in
    image.draw(in: CGRect(origin: .zero, size: newSize))
}

So ändern Sie die Pixel-pro-Punkt-Dichte (Standard ist der ppp des aktuellen Bildschirms):

let format = UIGraphicsImageRendererFormat()
format.scale = 1
UIGraphicsImageRenderer(size: newSize, format: format)
...


Beantwortet von –
Jano


Antwort geprüft von –
Timothy Miller (FixError Admin)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like