将图像重新分配给UIImageView时图像质量下降

时间:2016-01-11 13:49:07

标签: ios uiimageview uiimage image-size image-quality

我正在开发一个可以在图像中着色并导出它的应用程序。

我已将3个版本的图片资源添加到我的Assets.xcassets文件夹中。 这些是同一图像的3种不同尺寸,即: image1.png image1@2x.png image1@3x.png 各自的尺寸:256x341,512x683,768x1024像素。

我在我的故事板上创建了一个名为myImage的UIImageView,并通过storyboard-> utilities-> attributes inspector->将image1分配给myImage。图片视图 - >图像。

我正在尝试使用以下tintWithColor功能作为UIImage扩展名来更改此图片的颜色。

 extension UIImage {

    func tintWithColor(color:UIColor)->UIImage {

        UIGraphicsBeginImageContext(self.size)

        let context = UIGraphicsGetCurrentContext()
        self.drawAtPoint(CGPoint(x: 0, y: 0))
        CGContextSaveGState(context)

        // flip the image
        CGContextScaleCTM(context, 1.0, -1.0)
        CGContextTranslateCTM(context, 0.0, -self.size.height)

        // multiply blend mode
        CGContextSetBlendMode(context, CGBlendMode.Multiply)

        let rect = CGRectMake(0, 0, self.size.width, self.size.height)
        CGContextClipToMask(context, rect, self.CGImage)
        color.setFill()
        CGContextFillRect(context, rect)
        CGContextRestoreGState(context)

        // create uiimage
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return newImage   
    }
}

当我在viewDidLoad()上测试此功能以更改myImage.image的颜色时,我看到(在我使用的任何设备上)originalImage的宽度和高度总是256 x 341,5

 override func viewDidLoad() {
    super.viewDidLoad()

    let originalImage =  myImage.image
    print("LOG: original image width: \(originalImage!.size.width) height: \(originalImage!.size.height)")
    let tintedImage = originalImage!.tintWithColor(UIColor(hue: 300/360, saturation: 0.70, brightness: 0.70, alpha: 0.6))
     myImage.image = tintedImage
    // Do any additional setup after loading the view.
}

如果我不对我的图片应用这些更改,iPhone 6(4,7“)设备上的图像质量如下所示:

enter image description here

如果我应用tintWithColor然后将生成的图片重新分配给我的imageView,质量似乎会下降,线条会变得平滑,如下所示:

enter image description here

有没有办法避免这种质量损失? 最终我将导出高质量的图像,所以我想在这个图像的高质量版本上应用这种颜色色调功能。

谢谢。

1 个答案:

答案 0 :(得分:3)

UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.size.width,self.size.height),false,3.0)

应该有效