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)