UIImage的缩小 - 分辨率损失

4

我正在构建一个自定义图像键盘,但是在调整图像大小时遇到了问题。我尝试过多种不同的方法,但都没有成功。问题在于,图像要么比我想要的大,要么如果将其调整为我的目标大小的一半,则比原始图像更模糊。在下面的示例中,我试图将图像调整为与屏幕上显示的大小相同(请参见帖子底部的截图)。以下是我的调整大小代码:

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
}

最后,这是截图:

示例图片调整大小

更新:

为了澄清,屏幕截图底部的图片来自键盘。它是一个带有完整尺寸(750x750)图像的UIButton。当我将该图像复制到剪贴板时,我从完整尺寸图像开始,并将其缩小以匹配键盘中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

我很感激你的帮助,但我仍然不明白如何将所有内容整合在一起以获得正确大小的照片。为了完全澄清我的目标,我试图使复制到消息中的图像与键盘中的UIButton中的图像完全相同。这是我用于将图像添加到剪贴板以将其复制到消息文本中的代码。剪贴板代码在调整图像大小后运行:

Update 3

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

模糊的部分在哪里?你屏幕截图中的较小图像实际上更加清晰! - matt
如果你缩小一张图片,像素数量就会减少,因此它可能不会那么清晰。一个100x100像素的图像缩小到50x50像素将只有原来的四分之一像素数量。你的问题很明确。 - zaph
声明: "如果我将其缩小到预期大小的一半,那么它会更模糊"。为什么要缩小到预期大小的1/2? - zaph
你是如何显示图像的? - zaph
为在UIButton中显示图像,我只需使用setImage(image, forState: .Normal)函数。对于消息字段,在使用pb.setData(UIImagePNGRepresentation(image), forPasteboardType: type)将图像添加到剪贴板后,我通过按住文本框并在提示出现时按下粘贴按钮将图像粘贴到消息中。 - mgeno
我遇到了同样的问题。图片在iPhone 6+上显示正常,但在iPhone 6上失去了质量! - kb920
2个回答

1
注意:点并非像素。高分辨率屏幕可能由多个像素组成一个点。大小通常以点为单位指定,但图像以像素为单位。因此,对于Retina显示器,如果需要知道实际的固定大小,则必须使用比例因子。
如果将图像缩放到所需的点大小,并且显示器的分辨率大于点大小,则缩放比例> 1,图像将显得更模糊。
如果您正在运行时进行缩放,则需要将所需的点大小乘以显示比例值,以获得要缩放的像素大小。要获取屏幕比例:
let scale = UIScreen.mainScreen().scale

我在我的问题中添加了第二个更新,非常感谢你迄今为止的帮助。 - mgeno
乘法而非除法。您想要创建一个图像(比例 * 显示大小以点为单位)。let newSize = CGSize(width: size.width * scale, height: size.height * scale)。如果点数为78 x 78,则iPhone 6上的显示区域的像素为156 x 156。您希望缩放后的图像在像素上与显示区域的像素大小相同。 - zaph
谢谢你的帮助,zaph。我更新了我的帖子以展示现在发生的情况。你还能提供更多的见解吗? - mgeno

0
我回答这个问题是因为在进一步的工作中,我发现问题与图像调整大小无关。问题与剪贴板有关。Zaph正确地建议解决了图像调整大小的问题。我在这里发布了关于剪贴板的后续问题:Pasteboard UIImage not using scale

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接