UIImage 缩小 - 分辨率损失
UIImage downsizing - loss of resolution
我正在构建自定义图像键盘,但无法正确调整图像大小。我尝试了很多不同的方法但没有成功。问题是图像要么比我想要的大,要么,如果我将其调整为预期大小的一半,那么它比原始图像更模糊。在下面的示例中,我尝试将图像调整为与屏幕上显示的大小相同的大小(请参阅 post 的屏幕截图底部)。这是我调用调整大小的代码:
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
}
最后,截图如下:
更新:
澄清一下,屏幕截图底部的图像来自键盘。它是一个 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):
如您所见,虽然图像具有适当的框架,但与键盘中的 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 中的图像完全一样。这是我用来将图像添加到粘贴板以将其复制到消息文本中的代码。图片大小调整后粘贴板代码为运行:
pb.setData(UIImagePNGRepresentation(image), forPasteboardType: type)
注意:点不是像素。高分辨率屏幕可能具有由不止一个像素组成的点。大小通常以点为单位指定,但图像以像素为单位。因此,对于 Retina 显示器,如果需要知道实际的固定尺寸,则必须使用比例因子。
如果图像被缩放到所需的点大小并且显示器的分辨率大于点大小,scale > 1 图像将显得更加模糊。
如果您在运行时进行缩放,则需要将所需的磅值乘以显示比例值以获得要缩放到的像素大小。获取屏幕比例:
let scale = UIScreen.mainScreen().scale
我回答这个问题是因为经过进一步的工作,我发现这个问题与图像大小调整无关。问题与粘贴板有关。 Zaph 提出的纠正图像大小调整问题的建议是正确的。我在这里发布了关于粘贴板的后续问题:
Pasteboard UIImage not using scale
我正在构建自定义图像键盘,但无法正确调整图像大小。我尝试了很多不同的方法但没有成功。问题是图像要么比我想要的大,要么,如果我将其调整为预期大小的一半,那么它比原始图像更模糊。在下面的示例中,我尝试将图像调整为与屏幕上显示的大小相同的大小(请参阅 post 的屏幕截图底部)。这是我调用调整大小的代码:
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
}
最后,截图如下:
更新:
澄清一下,屏幕截图底部的图像来自键盘。它是一个 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):
如您所见,虽然图像具有适当的框架,但与键盘中的 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 中的图像完全一样。这是我用来将图像添加到粘贴板以将其复制到消息文本中的代码。图片大小调整后粘贴板代码为运行:
pb.setData(UIImagePNGRepresentation(image), forPasteboardType: type)
注意:点不是像素。高分辨率屏幕可能具有由不止一个像素组成的点。大小通常以点为单位指定,但图像以像素为单位。因此,对于 Retina 显示器,如果需要知道实际的固定尺寸,则必须使用比例因子。
如果图像被缩放到所需的点大小并且显示器的分辨率大于点大小,scale > 1 图像将显得更加模糊。
如果您在运行时进行缩放,则需要将所需的磅值乘以显示比例值以获得要缩放到的像素大小。获取屏幕比例:
let scale = UIScreen.mainScreen().scale
我回答这个问题是因为经过进一步的工作,我发现这个问题与图像大小调整无关。问题与粘贴板有关。 Zaph 提出的纠正图像大小调整问题的建议是正确的。我在这里发布了关于粘贴板的后续问题:
Pasteboard UIImage not using scale