调整图像大小但保留硬边

时间:2016-05-16 06:23:33

标签: ios xcode swift image image-resizing

我正在使用此链接中的一段代码 - Resize UIImage by keeping Aspect ratio and width,它运行正常,但我想知道是否可以更改它以保留像素的硬边缘。我希望将图像的大小加倍并保持像素的硬边缘。

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
}

What I want it to do

What it does

在Photoshop中,调整大小时会有最近邻居插值,在iOS中有类似内容吗?

3 个答案:

答案 0 :(得分:2)

受接受的答案启发,已更新为Swift 5。

快速5

let image = UIImage(named: "Foo")!
let scale: CGFloat = 2.0

let newSize = image.size.applying(CGAffineTransform(scaleX: scale, y: scale))
UIGraphicsBeginImageContextWithOptions(newSize, false, UIScreen.main.scale)
let context = UIGraphicsGetCurrentContext()!
context.interpolationQuality = .none
let newRect = CGRect(origin: .zero, size: newSize)
image.draw(in: newRect)

let newImage = UIImage(cgImage: context.makeImage()!)
UIGraphicsEndImageContext()

答案 1 :(得分:1)

进行了更多挖掘并找到答案 -

https://stackoverflow.com/a/25430447/4196903

但是

CGContextSetInterpolationQuality(context, kCGInterpolationHigh)

改为写

CGContextSetInterpolationQuality(context, CGInterpolationQuality.None)

答案 2 :(得分:0)

您需要使用CISampler类(仅适用于iOS 9)并且需要为此创建自己的自定义图像处理过滤器

您可以找到更多信息herehere too