UIImage的广场作物造成图像拉伸

当试图执行UIImage的中心裁剪时,我得到以下结果(左边是640*1136的原始图像,右边是修剪的图像适合320*320的正方形UIImageView ):

在这里输入图像说明 转向: 在这里输入图像说明

我已经对比例元素进行了很多调整,以便正确地检测修剪的数量:使用图像的较短边,基于short_side/width_of_desired_rect构build比率,但在这种情况下似乎不起作用。 帮助赞赏!

 - (UIImage *)squareImageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize { double ratio; double delta; CGPoint offset; //make a new square size, that is the resized imaged width CGSize sz = CGSizeMake(newSize.width, newSize.width); //figure out if the picture is landscape or portrait, then //calculate scale factor and offset if (image.size.width > image.size.height) { ratio = newSize.width / image.size.width; delta = (ratio*image.size.width - ratio*image.size.height); offset = CGPointMake(delta/2, 0); } else { ratio = newSize.width / image.size.height; delta = (ratio*image.size.height - ratio*image.size.width); offset = CGPointMake(0, delta/2); } //make the final clipping rect based on the calculated values CGRect clipRect = CGRectMake(-offset.x, -offset.y, (ratio * image.size.width) + delta, (ratio * image.size.height) + delta); //for retina consideration if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { UIGraphicsBeginImageContextWithOptions(sz, YES, 0.0); } else { UIGraphicsBeginImageContext(sz); } UIRectClip(clipRect); [image drawInRect:clipRect]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } 

尝试这个:

 - (UIImage *)squareImageFromImage:(UIImage *)image scaledToSize:(CGFloat)newSize { CGAffineTransform scaleTransform; CGPoint origin; if (image.size.width > image.size.height) { CGFloat scaleRatio = newSize / image.size.height; scaleTransform = CGAffineTransformMakeScale(scaleRatio, scaleRatio); origin = CGPointMake(-(image.size.width - image.size.height) / 2.0f, 0); } else { CGFloat scaleRatio = newSize / image.size.width; scaleTransform = CGAffineTransformMakeScale(scaleRatio, scaleRatio); origin = CGPointMake(0, -(image.size.height - image.size.width) / 2.0f); } CGSize size = CGSizeMake(newSize, newSize); if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { UIGraphicsBeginImageContextWithOptions(size, YES, 0); } else { UIGraphicsBeginImageContext(size); } CGContextRef context = UIGraphicsGetCurrentContext(); CGContextConcatCTM(context, scaleTransform); [image drawAtPoint:origin]; image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } 

使用此代码来调整图像大小

 // Returns image resized to the desired CGSize - (UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize { UIGraphicsBeginImageContext(newSize); [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } 

编辑:你基本上也在这里重绘。 如果你反复使用同一张图片,最好调用一次并将结果保存为一个文件。 在稍后的调用中加载而不是原来的。

编辑2:好的,所以你想要做的是保持高宽比,而适合图像到一个正方形。 上面的代码基本上通过resize来将图像调整到正方形,但不保持纵横比。 保持宽高比的一种方法是find缩小图像的两个维度中较大的一个因子,然后用相同的因子缩小另一个维度。 让我知道你是否有麻烦。

Swift3版fumoboy007的代码

  func squareImage(img: UIImage, scaledToSize newSize: CGFloat) -> UIImage { var scaleTransform: CGAffineTransform var origin: CGPoint var image = img if image.size.width > image.size.height { let scaleRatio: CGFloat = newSize / image.size.height scaleTransform = CGAffineTransform(scaleX: scaleRatio, y: scaleRatio) origin = CGPoint(x: -(image.size.width - image.size.height) / 2.0, y: 0) } else { let scaleRatio: CGFloat = newSize / image.size.width scaleTransform = CGAffineTransform(scaleX: scaleRatio, y: scaleRatio) origin = CGPoint(x: 0, y: -(image.size.height - image.size.width) / 2.0) } let size = CGSize(width: newSize, height: newSize) if image.size.width > image.size.height { UIGraphicsBeginImageContextWithOptions(size, true, 0) } else { UIGraphicsBeginImageContext(size) } let context: CGContext? = UIGraphicsGetCurrentContext() context?.concatenate(scaleTransform) image.draw(at: origin) image = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() return image }