Ios 部分截图及;图像质量损失

Ios 部分截图及;图像质量损失,ios,swift,image,screenshot,scale,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(

我正在打印一个部分屏幕截图,用于拍摄胶卷、电子邮件、短信、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)

这基本上将我的截图放大了2.0倍

这似乎给了我一个更清晰/质量更好的部分屏幕截图,尽管图像比我预期的要大

有没有其他更合适的解决方案


谢谢

问题在于
UIGraphicsBeginImageContext()
创建了一个缩放比例为
1.0
的图像上下文,但是您的层(在屏幕上显示时)的缩放比例与设备屏幕的缩放比例相当–很可能高于
1.0

因此,您希望使用
UIGraphicsBeginImageContextWithOptions()
,正如您所说的那样,但不是为刻度传递
2.0
(它可以在2x显示器上工作,但不能在其他显示器上工作),而是传递
0.0

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


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

Awesome!非常感谢!对于一个普通人(比如我自己),我自然会认为
UIGraphicsBeginImageContext(size)
vs
UIGraphicsBeginImageContextWithOptions()
和使用
0.0
的结果不会产生任何缩放,会产生相同的结果。显然不是。Terima kasih先生/女士!没问题!是的,
UIGraphicsBeginImageContext()
默认情况下使用
1.0
的刻度,这是核心图形的许多怪癖之一;)
UIGraphicsBeginImageContextWithOptions(imageView.bounds.size,true,2.0)