使用 drawInRect 调整图像大小,同时保持像 Scale Aspect Fill 这样的纵横比?

Resize an image with drawInRect while maintaining the aspect ratio like Scale Aspect Fill?

我想用 drawInRect 方法调整图像的大小,但我也想保持正确的纵横比,同时完全填充给定的帧(就像 .ScaleAspectFill 对 UIViewContentMode 所做的那样)。 有人对此有现成的答案吗?

这是我的代码(非常简单...):

func scaled100Image() -> UIImage {
    let newSize = CGSize(width: 100, height: 100)
    UIGraphicsBeginImageContext(newSize)
    self.pictures[0].drawInRect(CGRect(x: 0, y: 0, width: 100, height: 100))
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return newImage
}

好的,所以没有现成的答案...我为 UIImage 写了一个 swift 扩展,如果需要可以随意使用它。

这里是:

extension UIImage {
    func drawInRectAspectFill(rect: CGRect) {
            let targetSize = rect.size
    if targetSize == .zero {
        self.draw(in: rect)
    }
    let widthRatio    = targetSize.width  / self.size.width
    let heightRatio   = targetSize.height / self.size.height
    let scalingFactor = max(widthRatio, heightRatio)
    let newSize = CGSize(width:  self.size.width  * scalingFactor,
                         height: self.size.height * scalingFactor)
    UIGraphicsBeginImageContext(targetSize)
    let origin = CGPoint(x: (targetSize.width  - newSize.width)  / 2,
                         y: (targetSize.height - newSize.height) / 2)
    self.draw(in: CGRect(origin: origin, size: newSize))
    let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    scaledImage?.draw(in: rect)
    }
}

因此在上面的示例中,您可以这样使用它:

self.pictures[0].drawInRectAspectFill(CGRect(x: 0, y: 0, width: 100, height: 100))

Objective-C版本,如果有人需要(将此代码粘贴到 UIIMage 类别中):

- (void) drawInRectAspectFill:(CGRect) recto {

CGSize targetSize = recto.size;
if (targetSize.width <= CGSizeZero.width && targetSize.height <= CGSizeZero.height ) {
    return  [self drawInRect:recto];
}

float widthRatio = targetSize.width  / self.size.width;
float heightRatio   = targetSize.height / self.size.height;
float scalingFactor = fmax(widthRatio, heightRatio);
CGSize newSize = CGSizeMake(self.size.width  * scalingFactor, self.size.height * scalingFactor);

UIGraphicsBeginImageContext(targetSize);

CGPoint origin = CGPointMake((targetSize.width-newSize.width)/2,(targetSize.height - newSize.height) / 2);

[self drawInRect:CGRectMake(origin.x, origin.y, newSize.width, newSize.height)];
UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

[scaledImage drawInRect:recto];

}