保持纵横比和宽度来调整UIImage的大小

我在许多文章中看到通过保持宽高比调整图像大小。 这些function在resize时使用RECT的固定点(宽度和高度)。 但在我的项目中,我只需要根据宽度调整视图大小,高度应该根据高宽比自动调整。 任何人都可以帮我实现这个目标

如果你知道新尺寸的高度宽度,那么Srikar的方法工作得很好。 例如,如果您只知道要缩放的宽度,而不关心要先计算高度的比例因子的高度。

+(UIImage*)imageWithImage: (UIImage*) sourceImage scaledToWidth: (float) i_width { float oldWidth = sourceImage.size.width; float scaleFactor = i_width / oldWidth; float newHeight = sourceImage.size.height * scaleFactor; float newWidth = oldWidth * scaleFactor; UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight)); [sourceImage drawInRect:CGRectMake(0, 0, newWidth, newHeight)]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } 

如果您不知道图像是否为纵向或横向(例如,用户使用相机拍摄图片),我创build了另一种采用最大宽度和高度参数的方法。

比方说你有一个UIImage *myLargeImage这是一个4:3的比例。

 UIImage *myResizedImage = [ImageUtilities imageWithImage:myLargeImage scaledToMaxWidth:1024 maxHeight:1024]; 

如果横向显示,resize的UIImage将是1024×768; 768×1024如果肖像。 这种方法也会为视网膜显示产生更高的res图像。

 + (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)size { if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { UIGraphicsBeginImageContextWithOptions(size, NO, [[UIScreen mainScreen] scale]); } else { UIGraphicsBeginImageContext(size); } [image drawInRect:CGRectMake(0, 0, size.width, size.height)]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } + (UIImage *)imageWithImage:(UIImage *)image scaledToMaxWidth:(CGFloat)width maxHeight:(CGFloat)height { CGFloat oldWidth = image.size.width; CGFloat oldHeight = image.size.height; CGFloat scaleFactor = (oldWidth > oldHeight) ? width / oldWidth : height / oldHeight; CGFloat newHeight = oldHeight * scaleFactor; CGFloat newWidth = oldWidth * scaleFactor; CGSize newSize = CGSizeMake(newWidth, newHeight); return [ImageUtilities imageWithImage:image scaledToSize:newSize]; } 

感谢@ Maverick1st的algorithm,我把它实现到了Swift ,在我的情况下,height是input参数

 class func resizeImage(image: UIImage, newHeight: CGFloat) -> UIImage { let scale = newHeight / image.size.height let newWidth = image.size.width * scale UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight)) image.drawInRect(CGRectMake(0, 0, newWidth, newHeight)) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage } 

最佳答案Maverick 1st的正确翻译为Swift (使用最新的swift 3 ):

 func imageWithImage (sourceImage:UIImage, scaledToWidth: CGFloat) -> UIImage { let oldWidth = sourceImage.size.width let scaleFactor = scaledToWidth / oldWidth let newHeight = sourceImage.size.height * scaleFactor let newWidth = oldWidth * scaleFactor UIGraphicsBeginImageContext(CGSize(width:newWidth, height:newHeight)) sourceImage.draw(in: CGRect(x:0, y:0, width:newWidth, height:newHeight)) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage! } 

此方法是UIImage上的一个类别。 使用AVFoundation进行缩放以适应几行代码。 不要忘记导入#import <AVFoundation/AVFoundation.h>

 @implementation UIImage (Helper) - (UIImage *)imageScaledToFitToSize:(CGSize)size { CGRect scaledRect = AVMakeRectWithAspectRatioInsideRect(self.size, CGRectMake(0, 0, size.width, size.height)); UIGraphicsBeginImageContextWithOptions(size, NO, 0); [self drawInRect:scaledRect]; UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return scaledImage; } @end 

最简单的方法是设置您的UIImageView的框架,并将contentMode设置为resize选项之一。

代码是这样的 – 这可以用作实用方法 –

 + (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize { UIGraphicsBeginImageContext(newSize); [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } 

那么,我们在这里没有什么好的答案来调整图像的大小,但我只是根据我的需要进行修改。 希望这可以帮助像我这样的人。

我的要求是

  1. 如果图像宽度大于1920,则用1920宽度resize,并保持原始宽高比的高度。
  2. 如果图像高度大于1080,则用1080高度resize,并保持原始高宽比的宽度。

  if (originalImage.size.width > 1920) { CGSize newSize; newSize.width = 1920; newSize.height = (1920 * originalImage.size.height) / originalImage.size.width; originalImage = [ProfileEditExperienceViewController imageWithImage:originalImage scaledToSize:newSize]; } if (originalImage.size.height > 1080) { CGSize newSize; newSize.width = (1080 * originalImage.size.width) / originalImage.size.height; newSize.height = 1080; originalImage = [ProfileEditExperienceViewController imageWithImage:originalImage scaledToSize:newSize]; } + (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize { UIGraphicsBeginImageContext(newSize); [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } 

感谢@ Srikar Appal ,为了resize,我使用了他的方法。

您可能也想要检查这个以及resize的计算。

只需导入AVFoundation并使用AVMakeRectWithAspectRatioInsideRect(CGRectCurrentSize, CGRectMake(0, 0, YOUR_WIDTH, CGFLOAT_MAX)

编程方式:

 imageView.contentMode = UIViewContentModeScaleAspectFit; 

故事板:

在这里输入图像描述

为了改进Ryan的答案:

  + (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)size { CGFloat oldWidth = image.size.width; CGFloat oldHeight = image.size.height; //You may need to take some retina adjustments into consideration here CGFloat scaleFactor = (oldWidth > oldHeight) ? width / oldWidth : height / oldHeight; return [UIImage imageWithCGImage:image.CGImage scale:scaleFactor orientation:UIImageOrientationUp]; } 

Ryan的解决scheme@Ryan在swift代码中

使用:

  func imageWithSize(image: UIImage,size: CGSize)->UIImage{ if UIScreen.mainScreen().respondsToSelector("scale"){ UIGraphicsBeginImageContextWithOptions(size,false,UIScreen.mainScreen().scale); } else { UIGraphicsBeginImageContext(size); } image.drawInRect(CGRectMake(0, 0, size.width, size.height)); var newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } //Summon this function VVV func resizeImageWithAspect(image: UIImage,scaledToMaxWidth width:CGFloat,maxHeight height :CGFloat)->UIImage { let oldWidth = image.size.width; let oldHeight = image.size.height; let scaleFactor = (oldWidth > oldHeight) ? width / oldWidth : height / oldHeight; let newHeight = oldHeight * scaleFactor; let newWidth = oldWidth * scaleFactor; let newSize = CGSizeMake(newWidth, newHeight); return imageWithSize(image, size: newSize); } 

我用一种更简单的方法解决了这个问题

 UIImage *placeholder = [UIImage imageNamed:@"OriginalImage.png"]; self.yourImageview.image = [UIImage imageWithCGImage:[placeholder CGImage] scale:(placeholder.scale * 1.5) orientation:(placeholder.imageOrientation)]; 

比例乘数将定义图像的缩放,乘数越小,图像越小。 所以你可以检查什么适合你的屏幕。

或者,您也可以通过分割图像宽度/屏幕宽度来获得多重分辨率。

Swift 3中有一些变化。 这是UIImage的扩展:

 public extension UIImage { public func resize(height: CGFloat) -> UIImage? { let scale = height / self.size.height let width = self.size.width * scale UIGraphicsBeginImageContext(CGSize(width: width, height: height)) self.draw(in: CGRect(x:0, y:0, width:width, height:height)) let resultImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return resultImage } }