将图像重新分配给 UIImageView 时图像质量下降
Image quality loss when reassigning image to UIImageView
我正在开发一个可以为图像着色并导出的应用程序。
我已将 3 个版本的图像资产添加到我的 Assets.xcassets 文件夹中。
这是同一图像的 3 个不同尺寸,即:
image1.png图片1@2x.png图片1@3x.png
各自的尺寸:256x341、512x683、768x1024 像素。
我在故事板上创建了一个名为 myImage 的 UIImageView
并通过故事板->实用程序->属性检查器-> 图像视图-> 图像将 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") 设备上的质量如下所示:
如果我应用 tintWithColor
然后将生成的图像重新分配给我的 imageView
,质量似乎下降,线条变得平滑,如下所示:
有没有办法避免这种质量损失?
最终我会导出高质量的图像,所以我想在此图像的高质量版本上应用此颜色色调功能。
谢谢。
UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.size.width, self.size.height), false, 3.0)
应该可以
我正在开发一个可以为图像着色并导出的应用程序。
我已将 3 个版本的图像资产添加到我的 Assets.xcassets 文件夹中。 这是同一图像的 3 个不同尺寸,即: image1.png图片1@2x.png图片1@3x.png 各自的尺寸:256x341、512x683、768x1024 像素。
我在故事板上创建了一个名为 myImage 的 UIImageView
并通过故事板->实用程序->属性检查器-> 图像视图-> 图像将 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") 设备上的质量如下所示:
如果我应用 tintWithColor
然后将生成的图像重新分配给我的 imageView
,质量似乎下降,线条变得平滑,如下所示:
有没有办法避免这种质量损失? 最终我会导出高质量的图像,所以我想在此图像的高质量版本上应用此颜色色调功能。
谢谢。
UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.size.width, self.size.height), false, 3.0)
应该可以