如何在不降低分辨率的情况下降低UIImage的质量?

问题描述:

我的图片上传限制为2 MB。因此,如果用户尝试上传大于2 MB的图像,我想在不降低分辨率的情况下减小尺寸。如何在不降低分辨率的情况下降低UIImage的质量?

我该如何做到这一点?我想是这样的,但它没有工作:

 var fileSize = UIImageJPEGRepresentation(image, 1)!.length 
     print("before File size:") 
     print(fileSize) 

     while fileSize > MyConstants.MAX_ATTACHMENT_SIZE{ 

      let mydata = UIImageJPEGRepresentation(image, 0.75) 
      fileSize = mydata!.length 
      image = UIImage(data: mydata!)! 

      print("make smaller \(fileSize)") 
     } 

     print("after File size:") 
     print(UIImageJPEGRepresentation(image, 1)!.length) 

输出:

before File size: 
2298429 
make smaller 846683 
after File size: 
2737491 
+0

为什么使用while循环?你可以使用if() –

+0

while循环将以0.75的质量递归地创建一个图像,而不像if条件 – akdsouza

let mydata = UIImageJPEGRepresentation(image, 0.75) 
     fileSize = mydata!.length 
     image = UIImage(data: mydata!)! 

这是正确的做法。您可以从0.1 to 1中设置不同的比例,以减少图像的质量和大小。

print(UIImageJPEGRepresentation(image, 1)!.length)此行再次提高图像的质量和大小或分辨率为最大(because scale = 1)

+0

这个更新并没有增加任何新内容,这与我在我的回答中所陈述的相同。 – akdsouza

正如@Lion说,你将不得不玩的质量达到一个愉快的文件大小。然而,我注意到:

print(UIImageJPEGRepresentation(image, 1)!.length) 

将以最高质量打印图像长度。这是因为在内部条件下的误导,你正在实现更小的文件大小。

while fileSize > MyConstants.MAX_ATTACHMENT_SIZE{ 

      let mydata = UIImageJPEGRepresentation(image, 0.75) 
      fileSize = mydata!.length 
      image = UIImage(data: mydata!)! 

      print("make smaller \(fileSize)") 
     } 
+0

我注意到,但是当我用新的小型mydata设置图像时,它会不会变小? –

+0

是的,它会。它是一个捕获22,因为你必须在某个地方达成妥协,才能满足你的实现。你可以探索在Swift中等价的[UIImage imageWithData:scale:]方法。 – akdsouza

+0

谁投了票,会不会添加一个理由而不是隐藏呃? – akdsouza