2015-05-29 140 views
10

我想用drawInRect方法调整图片的大小,但我也想保持正确的宽高比,同时完全填充给定的框架(如.ScaleAspectFill为UIViewContentMode所做的那样)。 任何人都有这个准备好的答案?使用drawInRect调整图像大小,同时保持比例方面填充的纵横比?

这里是我的代码(很简单...):

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 
} 

回答

24

OK,所以没有现成的答案......我写的UIImage迅速扩展,随时如果你需要使用它它。

这就是:

extension UIImage { 
    func drawInRectAspectFill(rect: CGRect) { 
     let targetSize = rect.size 
     if targetSize == CGSizeZero { 
      return self.drawInRect(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.drawInRect(CGRect(origin: origin, size: newSize)) 
     let scaledImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     scaledImage.drawInRect(rect) 
    } 
} 

所以在上面的例子中,你使用它这样的:

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

你是我的英雄 – MScottWaller

+0

对我不太好。我每次运行这个程序时都会损失40MB,并且会崩溃我的应用程序,因为我试图一次缩减大量照片。 – RowanPD

+0

使用比例因此图像不模糊--UIGraphicsBeginImageContextWithOptions(targetSize,true,UIScreen.mainScreen()。scale)' –

1

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

}

相关问题