UIImage缩小规模 - 失去分辨率

时间:2015-09-01 03:07:16

标签: ios swift uiimage

我正在构建自定义图像键盘,但无法正确调整图像大小。我尝试了一堆不同的方法但没有成功。问题是图像要比我想要的要大,或者如果我将它调整到我想要的尺寸的一半,那么它比原始图像更模糊。在下面的示例中,我尝试将图像调整为相同大小(请参见屏幕截图的底部),因为它正在屏幕上显示。这是我调用调整大小的代码:

println("Starting Size is \(image!.size)")
println("New Size is: \(sender.frame.size))")
println("Initial Scale: \(image!.scale)")

image = imageResize(image!, size: CGSize(width: sender.frame.width, height: sender.frame.height))

println("Final Size is \(image!.size)")
println("Final Scale: \(image!.scale)")

以下是上述打印语句的控制台输出:

Starting Size is (750.0, 750.0)
New Size is: (78.0, 78.0))
Initial Scale: 1.0
Final Size is (78.0, 78.0)
Final Scale: 2.0

这是imageResize函数

func imageResize(image:UIImage, size:CGSize)-> UIImage {
    UIGraphicsBeginImageContextWithOptions(size, false, 0)
    var context = UIGraphicsGetCurrentContext()

    CGContextSetInterpolationQuality(context, kCGInterpolationHigh)
    image.drawInRect(CGRect(origin: CGPointZero, size: size))

    let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return scaledImage
}

最后,这是截图:

Example Image Resizing

更新

为了澄清,屏幕截图底部的图像来自键盘。它是一个UIButton,其中放置了全尺寸(750x750)图像。当我将图像复制到粘贴板时,我从全尺寸图像开始并缩小尺寸以匹配键盘中UIButton的框架。所以我试图让短信中的图像大小相同,并且键盘中的图像清晰度相同。

更新#2

我更新了图像尺寸调整功能,根据屏幕比例调整图像尺寸:

func imageResize(image:UIImage, size:CGSize)-> UIImage {

    let scale  = UIScreen.mainScreen().scale
    let newSize = CGSize(width: size.width / scale, height: size.height / scale)

    UIGraphicsBeginImageContextWithOptions(newSize, false, scale)
    var context = UIGraphicsGetCurrentContext()

    CGContextSetInterpolationQuality(context, kCGInterpolationHigh)
    image.drawInRect(CGRect(origin: CGPointZero, size: newSize))

    let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return scaledImage
}

以下是控制台输出中有关图像的一些详细信息:

Starting Size is (750.0, 750.0)
New Size is: (78.0, 78.0))
Initial Scale: 1.0
Final Size is (39.0, 39.0)
Final Scale: 2.0

最后,这是设备(iPhone 6)上的图像:

Second Screenshot

正如您所看到的,尽管图像具有适当的帧,但与键盘中的UIButton相比,它看起来很模糊。我应该能够达到与UIButton相同的分辨率,因为我在两种情况下都以全尺寸图像开始。有关为什么我会失去决议的想法吗?

更新#3

我更新了我的代码,将图像乘以比例,而不是除以它。

let newSize = CGSize(width: size.width * scale, height: size.height * scale)

结果如下:

Starting Size is (750.0, 750.0)
New Size is: (78.0, 78.0))
Initial Scale: 1.0
Final Size is (156.0, 156.0)
Final Scale: 2.0

Update 3

我真的很感谢你的帮助,但我仍然不理解如何将这些全部拉到一起以获得尺寸合适的照片。为了完全阐明我的目标,我试图使复制到消息中的图像看起来与键盘内UIButton中的图像完全相同。这是我用来将图像添加到粘贴板以将其复制到消息文本中的代码。在调整图像大小后运行粘贴板代码:

pb.setData(UIImagePNGRepresentation(image), forPasteboardType: type)

2 个答案:

答案 0 :(得分:1)

注意:点不是像素。高分辨率屏幕可以具有由多于一个像素组成的点。大小通常以点指定,但图像以像素为单位。因此,对于Retina显示器,如果需要知道实际的固定尺寸,则必须使用比例因子。

如果图像缩放到所需的点大小并且显示器具有比点大小更大的分辨率,则缩放> 1图像看起来会更模糊。

如果要在运行时进行缩放,则需要通过显示比例值将所需的点大小多个,以使像素大小缩放到。要获得屏幕比例:

let scale = UIScreen.mainScreen().scale

答案 1 :(得分:0)

我正在回答这个问题,因为在进一步的工作之后,我发现问题与图像大小调整没有关系。这个问题与粘贴板有关。 Zaph,他的建议是正确的纠正图像调整大小问题。我在这里发布了关于粘贴板的后续问题:

Pasteboard UIImage not using scale