我有一个非常简单的UIView包含一些黑色和白色UIImageViews.如果我通过设备上的物理按钮截取屏幕截图,结果图像看起来就像我看到的那样(如预期的那样) - 如果我在像素级检查图像,它只是黑白图像.
但是,如果我使用以下代码片段以编程方式执行相同的操作,则生成的图像具有应用的抗锯齿功能 - 所有黑色像素都被微弱的灰色晕圈包围.我的原始场景中没有灰色 - 它是纯黑色和白色,"截图"图像的尺寸与我以编程方式生成的尺寸相同,但我似乎无法弄清楚灰色晕圈的来源.
UIView *printView = fullView;
UIGraphicsBeginImageContextWithOptions(printView.bounds.size, NO, 0.0);
CGContextRef ctx = UIGraphicsGetCurrentContext();
[printView.layer renderInContext:ctx];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
UIGraphicsEndImageContext();
Run Code Online (Sandbox Code Playgroud)
我试图在调用之前添加以下内容renderInContext以试图阻止抗锯齿,但它没有明显的效果:
CGContextSetShouldAntialias(ctx, NO);
CGContextSetAllowsAntialiasing(ctx, NO);
CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh);
Run Code Online (Sandbox Code Playgroud)
以下是两个不同输出的示例 - 左侧是我的代码生成的,右侧是正常的iOS屏幕截图:

因为我试图将我的输出发送renderInContext到单色打印机,所以由于打印机的抖动算法,灰色像素会导致一些丑陋的伪像.
那么,我怎么能renderInContext像真实的设备截图一样产生我的视图的像素级输出呢 - 就像我原来场景中的黑白一样?
事实证明,该问题UIImage与UIImageView. 这UIImage是CGImage使用数据提供者创建的。尺寸CGImage以与父级相同的单位指定,UIImageView但我使用的是带有视网膜显示屏的 iOS 设备。
因为CGImage尺寸是以非视网膜尺寸指定的,renderInContext所以正在放大 CGImage,并且显然这种放大的行为与实际屏幕渲染所做的不同。(由于某种原因,真实屏幕渲染在不添加任何灰色像素的情况下进行了放大。)
为了解决这个问题,我CGImage用两倍的尺寸创建了 my UIImageView,然后我调用renderInContext生成了更好的黑白图像。一些白色区域中仍然存在一些灰色像素,但这比原来的问题有了很大的改进。
我最终通过更改调用UIGraphicsBeginImageContextWithOptions()以强制其缩放为 1.0 来解决这个问题,并注意到UIImageView黑色像素渲染不再有灰色光晕。当我强制UIGraphicsBeginImageContextWithOptions()将比例因子设置为 2.0(这是由于视网膜显示而默认的比例因子)时,出现了灰色光晕。
| 归档时间: |
|
| 查看次数: |
1370 次 |
| 最近记录: |