【问题标题】:iOS Swift: How to properly scale down an image?iOS Swift:如何正确缩小图像?
【发布时间】:2016-10-29 23:01:22
【问题描述】:

我正在使用 AlamofireImage 下载并设置我的 UIImage:

backdrop.af_setImageWithURL(downloadURL)

图像比我要显示的要大得多,所以我遇到了锯齿问题。如何正确调整此图像的大小?

结果:

【问题讨论】:

  • 你能告诉我们你到目前为止做了什么,但没有奏效,以便我们为你提供帮助。因为现在正在查看问题,它可以归类为基于意见的问题,不适合本论坛。
  • 我没有做过任何关于抗锯齿的事情,我不知道该怎么做。除了锯齿之外,我的图像显示得非常好。 @Andrej
  • 您的别名问题是什么?大多数调整大小的算法都可能产生相同的效果。重新调整大小算法,请参阅stackoverflow.com/a/28513086/1271826。不过,通常我们会调整大小以尽量减少对内存的影响,而不是解决由于更改大小而导致的图像软化问题。
  • 顺便说一句,Alamofireimage 已经有图片scaling methods,所以你可能不需要自己写。
  • 我已经尽我所能描述了我关于别名的问题,我能描述它的唯一方法是它看起来太尖锐了。靠近在一起的细线看起来不正确。我觉得图像确实需要更柔和。我在情节提要中使用了“Aspect Fit”模式来缩放我的图像。我将使用公认的解决方案发布前后图片,以便您查看。 @Rob

标签: ios swift uiimageview aliasing alamofireimage


【解决方案1】:

一旦你有一个有效的UIImage,你就可以用任何尺寸调整图像的大小:

func resizedImageWith(image: UIImage, targetSize: CGSize) -> UIImage {

    let imageSize = image.size
    let newWidth  = targetSize.width  / image.size.width
    let newHeight = targetSize.height / image.size.height
    var newSize: CGSize

    if(newWidth > newHeight) {
        newSize = CGSizeMake(imageSize.width * newHeight, imageSize.height * newHeight)
    } else {
        newSize = CGSizeMake(imageSize.width * newWidth,  imageSize.height * newWidth)
    }

    let rect = CGRectMake(0, 0, newSize.width, newSize.height)

    UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)

    image.drawInRect(rect)

    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage
}

对于您有任何其他疑问/修改,请参阅NShipster

【讨论】:

  • 同意!是的,当我们将scale 设置为 0.0 时,将使用主屏幕的比例,对于 Retina 屏幕,该比例为 2.0 或更大。更新了我的答案。
  • 我也会用 UIJPEGRepresentation(image, amountToScale0Through1) 缩小它
  • @Sethmr - UIImageJPEGRepresentation 不进行任何缩放。它所做的只是将UIImage 转换为NSData(要么使资产变得更大要么缩小它,但在此过程中引入了JPEG 伪影)。有时您需要UIImageJPEGRepresentation,但这个问题中没有任何内容表明这就是这里所需要的。
  • 我确信它会减小文件大小。我想我误解了需要什么。
  • @sethmr - 是的,您可以使用低于 1.0 的质量设置来减小文件大小,但它不会缩放图像,而是应用有损压缩(即降低图像质量,引入伪影,在 0.8 或 0.9 时几乎不明显,但在较低的值时视觉上明显)。它在尝试减小图像大小时很有用,例如上传到 Web 服务,但不会减少 UIImage 的运行时内存使用量。为了节省运行时内存,您必须缩放图像,如 Santosh 的回答中所示(或使用 Alamofireinage 缩放方法,它们做同样的事情)。
【解决方案2】:

这是 @Santosh 在 ObjC 中的回答:

- (UIImage*) scaleImage:(UIImage*)image toSize:(CGSize)newSize {

    CGSize imageSize = image.size;
    CGFloat newWidth  = newSize.width  / image.size.width;
    CGFloat newHeight = newSize.height / image.size.height;
    CGSize newImgSize;

    if(newWidth > newHeight) {
        newImgSize = CGSizeMake(imageSize.width * newHeight, imageSize.height * newHeight);
    } else {
        newImgSize = CGSizeMake(imageSize.width * newWidth,  imageSize.height * newWidth);
    }

    CGRect rect = CGRectMake(0, 0, newImgSize.width, newImgSize.height);

    UIGraphicsBeginImageContextWithOptions(newImgSize, false, 0.0);

    [image drawInRect:rect];;

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}

【讨论】:

    猜你喜欢
    • 2018-01-16
    • 2014-01-20
    • 2016-09-19
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 2016-05-22
    相关资源
    最近更新 更多