2017-08-27 78 views
0

我收到了来自后端的形象是大尺寸的,因为我必须把相同的图像档案图片,并显示在同一图像底部酒吧在大小30x30的标签栏中。我试图以各种方式缩小图像,但没有任何工作。规模下降非常大尺寸图像无失真和质量损失非常小尺寸图像

试过(被模糊显示图像和扭曲的),它也没有工作Alamofire的方法:

func resizeImageWithoutDistortion(image: UIImage, size : CGSize) -> UIImage{ 


    // 1. Scale image to size disregarding aspect ratio 
    let scaledImage = image.af_imageScaled(to: size) 

    // 2. Scale image to fit within specified size while maintaining aspect ratio 
    let aspectScaledToFitImage = image.af_imageAspectScaled(toFit: size) 

    // 3. Scale image to fill specified size while maintaining aspect ratio 
    let aspectScaledToFillImage = image.af_imageAspectScaled(toFill: size) 

    return scaledImage.roundImage() 
} 

也试过如下这也没有工作:

func resizeImage(_ newWidth: CGFloat) -> UIImage { 

     let ratio = size.width/size.height 
     if ratio > 1 { 
      UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newWidth)) 
      draw(in: CGRect(x: newWidth * ratio/2 - newWidth, y: 0, width: newWidth * ratio, height: newWidth)) 
      let newImage = UIGraphicsGetImageFromCurrentImageContext() 
      UIGraphicsEndImageContext() 

      return newImage!.roundImage() 
     } else { 
      UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newWidth)) 
      draw(in: CGRect(x: 0, y: (newWidth/ratio - newWidth)/2 * (-1), width: newWidth, height: newWidth/ratio)) 
      let newImage = UIGraphicsGetImageFromCurrentImageContext() 
      UIGraphicsEndImageContext() 

      return newImage!.roundImage() 
     } 
    } 

在底部的图像截图非常失真。 enter image description here

+0

请与你的意思是行不通的更新您的文章,而你是在它包括一个问题(这是一个Q&A网站,而不是V&S(模糊描述和建议网站)。您还应详细指出原始图像的样子,因为除非您以高分辨率但低细节的图像开始,否则无法缩放至30x30没有质量损失(和相关的失真,例如通过描述高分辨率图像从原来的30x30图像被炸毁。 – Anthon

+0

嗨,我已经添加了截图和al l我想要的是保持图像的质量在个人资料图片和底部栏。 – Ishika

+0

我认为UIImage应该自己做。只是不要调整图像大小。让它保持那么大,并使用方面填充。为了使图像轮回使用UIImage的图层并绕过它,而不是真正处理图像。这是一个非常昂贵的操作。确保在该图像视图上将纵横比设置为1:1。 – BennX

回答

0

Ishika,你的问题是不是质量损失。你的问题是你不考虑iOS Scaling。

点和像素是同样的事情。

如果您有W: 30H: 30(点)的的UIImageView来计算您在像素的图像清晰地显示出它在不影响质量,你需要有一个形象像素尺寸

30 * UIScreen.main.scale = 60像素(如果2X规模)

30 * UIScreen.main.scale = 90像素(如果3×秤)

这也是为什么你需要提供@ 2x和@ 3个缩放图像的iOS一样的道理。

所以,如果你要调整你的UIImage到更小的尺寸,你需要采取比例考虑在内。否则,你的图片将被调整来填写UIImageView而且由于UIImageViewUIImage尺寸更大,他们会变得非常模糊。

一个很好的方式来看到这是如果你设置yourImageView.contentMode = .Center你会注意到UIImage比UIImageView本身小。

我不代码斯威夫特,所以我不能为你提供直接的代码(累翻译),但如果你看看其他线程:

scale image to smaller size in swift3

您将看到,UIGraphicsBeginImageContext是示例缺少比例尺输入。

规模

规模因子用于该位图。如果您指定的值为 为0.0,则缩放系数将设置为设备 主屏幕的缩放系数。

编辑: 在你的情况,这样的事情:

newWidth = newWidth/UIScreen.main.scale 

UIGraphicsBeginImageContextWithOptions(CGSize(width: newWidth, height: newWidth), true, 0) 
+0

感谢您的答案,但我已经使用默认管理其imageView的tabbar项目。我没有访问它,因此无法摆弄imageView的内容模式。此外,当我按照您所建议的比例缩放图像时,我会在底部栏中看到尺寸为90x90的图像。 – Ishika

+0

@Ishika你正在做错计算如果它正在移出标签栏imageView。如果您应用比例因子0.0,然后输入30x30,则您将在3x比例上具有60x60像素和90x90。如果您键入90x90,则会以180x180像素或270x270像素结束。你需要反过来缩小它,所以你最终得到30像素,而不是30点。看到我编辑的答案。您仍然可以通过此https://developer.apple.com/documentation/coregraphics/1456148-cgimagegetwidth查看图片的像素大小 – 2017-08-28 08:04:06