在Swift 3.0中对UIImage的init(data:scale :)方法感到困惑

时间:2016-10-04 06:56:49

标签: ios swift uiimage

这是我的目的,我的图像宽度为750,我想将其缩放到128 然后我发现了一个名为UIImage的init方法 init(data:scale:)

接下来是我的代码

func scaleImage(image:UIImage, ToSpecificWidth targetWidth:Int) -> UIImage{
        var scale =  Double(targetWidth) / Double(image.size.width)
        let scaledImage = UIImage(data: UIImagePNGRepresentation(image)!  as Data, scale: CGFloat(scale))
        return scaledImage!
}

print("originImageBeforeWidth: \(portrait?.size.width)") // output: 750
let newImage = Tools.scaleImage(image: portrait!, ToSpecificWidth: 128) // the scale is about 0.17
print("newImageWidth: \(newImage.size.width)") // output: 4394.53125
显然新宽度离我的意图太远了 我正在寻找750 * 0.17 = 128 但我得到750 / 0.17 = 4394

然后我改变了我的scaleImage函数 这是更新的代码

func scaleImage(image:UIImage, ToSpecificWidth targetWidth:Int) -> UIImage{
        var scale =  Double(targetWidth) / Double(image.size.width)
        scale = 1/scale // new added
        let scaledImage = UIImage(data: UIImagePNGRepresentation(image)!  as Data, scale: CGFloat(scale))
        return scaledImage!
}

print("originImageBeforeWidth: \(portrait?.size.width)") // output: 750
let newImage = Tools.scaleImage(image: portrait!, ToSpecificWidth: 128) // the scale is about 5.88
print("newImageWidth: \(newImage.size.width)") // output: 128

这正是我想要的,但代码比例= 1 /比例没有任何意义

这里发生了什么?

2 个答案:

答案 0 :(得分:1)

您尝试使用的init方法不是为了调整图像大小。并且scale参数不是调整大小的比例。它是1x,2x,3x比例。从本质上讲,scale的唯一有效值目前是1.0,2.0或3.0。

scale设置为您预期的倒数会给您一个size属性,返回您想要的结果,但它根本不是您应该做的。

有适当的方法可以调整图像的大小,例如How to Resize image in Swift?以及其他图像。

答案 1 :(得分:0)

根据苹果文件,

UIImage.scale
解释图像数据时要采用的比例因子。应用比例因子1.0会导致图像的大小与图像的基于像素的尺寸相匹配。应用不同的比例因子会更改size属性报告的图像大小。

UIImage.size
此值反映图像的逻辑大小,并考虑图像的当前方向。将size值乘以scale属性中的值,以获取图像的像素尺寸。

所以,
实际像素大小=尺寸*比例

这就是你需要设置1 / scale的原因。

顺便说一下,
scale只能正确影响UIImage的大小值 这意味着它只会影响屏幕显示的大小,而不会改变像素大小 如果要调整大小,可以使用缩放和使用进行绘制 的 UIGraphicsGetImageFromCurrentImageContext()