图像缩放和质量损失

时间:2016-01-08 00:02:06

标签: ios swift

我一直试图将图像缩小到较小的尺寸一段时间,并且无法弄清楚为什么它会失去质量,即使我遇到教程说它不应该。首先,我将图像裁剪成正方形,然后使用此代码:

let newRect = CGRectIntegral(CGRectMake(0,0, newSize.width, newSize.height))
            let imageRef = image.CGImage

            UIGraphicsBeginImageContextWithOptions(newSize, false, 0)
            let context = UIGraphicsGetCurrentContext()

            // Set the quality level to use when rescaling
            CGContextSetInterpolationQuality(context, CGInterpolationQuality.High)
            let flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, newSize.height)

            CGContextConcatCTM(context, flipVertical)
            // Draw into the context; this scales the image
            CGContextDrawImage(context, newRect, imageRef)

            let newImageRef = CGBitmapContextCreateImage(context)! as CGImage
            let newImage = UIImage(CGImage: newImageRef)

            // Get the resized image from the context and a UIImage
            UIGraphicsEndImageContext()

我也试过这个代码的结果相同:

        let newSize:CGSize = CGSize(width: 30,` height: 30)

        let rect = CGRectMake(0, 0, newSize.width, newSize.height)

        UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)

        UIBezierPath(

            roundedRect: rect,

            cornerRadius: 2

            ).addClip()

        image.drawInRect(rect)

        let newImage = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()

        let imageData = UIImageJPEGRepresentation(newImage, 1.0)

        sharedInstance.my.append(UIImage(data: imageData!)!)

调整大小后,我仍然会看到模糊的图像。我将它与我有一个图像视图并将其设置为纵横填充/拟合时进行比较,图像更清晰,更小。这就是我想要的品质,无法弄清楚我错过了什么。我在这里放了两张照片,第一张是使用imageView的更清晰的图像,第二张是用我的代码调整大小的图片。如何在图像视图中操作图像看起来清晰?

Clear image view

blurry

3 个答案:

答案 0 :(得分:2)

你应该使用

let newSize:CGSize = CGSize(width: 30 * UIScreen.mainScreen().scale, height: 30 * UIScreen.mainScreen().scale) 

这是因为不同的iPhone有不同的尺寸。

答案 1 :(得分:1)

选择图片视图,点击"尺寸"检查员并更改" X", " Y","宽度"和"身高"属性。

X = 14 
Y = 10 
Width = 60 
Height = 60 

对于圆形半径,您可以实现此代码:

cell.ImageView.layer.cornerRadius = 30.0
cell.ImageView.clipsToBounds = true

或 转到Identity检查器,单击左下角的Add按钮(+) 用户定义的运行时属性编辑器。 双击新属性的“密钥路径”字段,将属性的密钥路径编辑为layer.cornerRadius  将类型设置为Number30的值。要从方形图像制作圆形图像, radius设置为图像视图宽度的一半。

Duncan给你一个很好的解释30到30太小了,为什么像素或图像的质量都会丢失,我建议你使用60乘60

答案 2 :(得分:0)

在您显示的示例图像中,您绘制的“后”图像大于起始图像。如果将图像从较大的尺寸缩小到30像素×30像素,则会丢弃大量信息。如果你然后以更大的尺寸绘制30x30图像,它会看起来很糟糕。 30乘30是一个很小的图像,没有太多的细节。