部分截图&图像质量下降

时间:2016-02-03 16:30:21

标签: ios swift image screenshot scale

我正在为相机胶卷,电子邮件,短信,FB,Twitter等打印部分屏幕截图...选择部分屏幕 - 顶部100像素,底部100像素。

我使用了以下代码:

let top: CGFloat = 100
let bottom: CGFloat = 100

let size = CGSize(width: view.frame.size.width, height: view.frame.size.height - top - bottom)

UIGraphicsBeginImageContext(size)

let context = UIGraphicsGetCurrentContext()!

CGContextTranslateCTM(context, 0, -top)

view.layer.renderInContext(context)

let snapshot = UIGraphicsGetImageFromCurrentImageContext()

UIGraphicsEndImageContext()

UIImageWriteToSavedPhotosAlbum(snapshot, nil, nil, nil)

结果截图质量很差。

我研究了几个小时,发现有几个人有类似的问题。我不能完全理解为我的问题修改解决方案。

我确实设法找到了一个半修复程序。我改变了:

UIGraphicsBeginImageContext(size)

UIGraphicsBeginImageContextWithOptions(imageView.bounds.size,true,2.0)

基本上按照因子2.0扩展我的屏幕截图

这似乎给了我一个更清晰/更好质量的部分截图,虽然图像比我想象的要大。

我可以申请哪种解决方案可能更合适吗?

谢谢!

1 个答案:

答案 0 :(得分:7)

问题在于UIGraphicsBeginImageContext()创建了一个缩放为1.0的图像上下文,但是您的图层(因为它在屏幕上显示)具有相当于设备屏幕比例的比例 - 这是最有可能高于1.0

因此,您希望正确使用UIGraphicsBeginImageContextWithOptions(),但不是传递2.0作为比例(可以在2x显示上工作,而不是在其他显示上),传递{{1} }。

As the documentation says for the scale argument:

  

要应用于位图的比例因子。 如果指定值0.0,则比例因子将设置为设备主屏幕的比例因子。

因此,当您执行此操作时,上下文将自动检测屏幕的比例因子,并且图像将在您运行它的任何设备上显得清晰明了。