7

我有一个非常简单UIView的包含几个黑白UIImageView的s。如果我通过设备上的物理按钮截取屏幕截图,生成的图像看起来与我看到的完全一样(如预期的那样) - 如果我在像素级别检查图像,它只是黑白的。

但是,如果我使用以下代码片段以编程方式执行相同的操作,则生成的图像似乎应用了抗锯齿 - 所有黑色像素都被微弱的灰色光晕包围。我的原始场景中没有灰色——它是纯黑白的,“屏幕截图”图像的尺寸与我以编程方式生成的图像相同,但我似乎无法弄清楚灰色光晕的来源。

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();

我尝试在调用之前添加以下内容renderInContext以防止抗锯齿,但它没有明显的效果:

CGContextSetShouldAntialias(ctx, NO);
CGContextSetAllowsAntialiasing(ctx, NO);
CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh);

这是两个不同输出的示例 - 左侧是我的代码生成的,右侧是正常的 iOS 屏幕截图:

在此处输入图像描述

由于我试图将我的输出发送renderInContext到单色打印机,因此由于打印机的抖动算法,灰色像素会导致一些难看的伪影。

那么,我怎样才能renderInContext产生与真实设备屏幕截图相同的像素级输出 - 即,与原始场景中的一样只是黑白?

4

2 回答 2

3

事实证明,问题UIImageUIImageView. UIImageCGImage使用数据提供者创建的。CGImage尺寸以与父级相同的单位指定,但是UIImageView我使用的是带有视网膜显示屏的 iOS 设备。

因为CGImage尺寸是在非视网膜尺寸中指定的,renderInContext所以放大了 CGImage 并且显然这种放大的行为与实际屏幕渲染所做的不同。(由于某种原因,真实的屏幕渲染在没有添加任何灰色像素的情况下进行了放大。)

为了解决这个问题,我CGImage用两倍的尺寸创建了我UIImageView,然后我的调用renderInContext产生了一个更好的黑白图像。一些白色区域仍然有一些灰色像素,但它比原始问题有了很大的改进。

我终于通过更改调用来解决这个问题,UIGraphicsBeginImageContextWithOptions()以强制它进行 1.0 的缩放,并注意到UIImageView黑色像素渲染不再有灰色光环。当我强制UIGraphicsBeginImageContextWithOptions()使用 2.0 的比例因子(这是由于视网膜显示而默认设置的)时,出现了灰色光晕。

于 2013-01-14T19:18:18.673 回答
1

我会尝试设置

 printView.layer.magnificationFilter

 printView.layer.minificationFilter

 kCAFilterNearest

图像是否在UIImageView实例中显示?是printView他们的superview吗?

于 2013-01-14T14:53:46.363 回答