Ios 对UIImage感到困惑';Swift 3.0中的s init(数据:scale:)方法

Ios 对UIImage感到困惑';Swift 3.0中的s init(数据:scale:)方法,ios,swift,uiimage,Ios,Swift,Uiimage,这是我的目的,我有一个750的图像宽度,我想扩大到128 然后我找到了UIImage的一个init方法,名为 接下来是我的代码 func scaleImage(image:UIImage, ToSpecificWidth targetWidth:Int) -> UIImage{ var scale = Double(targetWidth) / Double(image.size.width) let scaledImage = UIImage(data

这是我的目的,我有一个750的图像宽度,我想扩大到128 然后我找到了UIImage的一个init方法,名为

接下来是我的代码

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/比例没有任何意义


这里发生了什么?

您尝试使用的
init
方法不是为了调整图像大小。而且
比例
参数不是调整比例。这是1倍,2倍,3倍的刻度。本质上,
scale
的唯一有效值当前为1.0、2.0或3.0

比例
设置为与预期相反的值时,会得到返回所需结果的
大小
属性,但这根本不是您应该做的


有适当的方法可以调整图像的大小,比如其他图像。

根据苹果的文档


解释图像数据时要采用的比例因子。应用比例因子1.0会生成大小与基于像素的图像尺寸匹配的图像。应用不同的比例因子会更改“大小”属性报告的图像大小


此值反映图像的逻辑大小,并考虑图像的当前方向。将“大小”值乘以“缩放”属性中的值,以获得图像的像素尺寸

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

这就是为什么需要设置1/比例

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