7

当图像放大(在我的情况下非常远)并渲染最近邻以保留硬边缘时,我遇到屏幕截图(以编程方式使用下面的代码)与屏幕上实际显示的内容不一致。我从这些论坛获得了以下屏幕截图代码,但保存的是图像的(双线性?)渲染而不是最近邻。

UIGraphicsBeginImageContextWithOptions([[UIScreen mainScreen] bounds].size, NO, 0.0);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *imageView = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(imageView, nil, nil, nil);

我做最近邻的方式是在 ViewDidLoad 中使用以下行

automataView.layer.magnificationFilter = kCAFilterNearest;

(automataView 是一个带有 GIF 文件的 UIImageView,它作为子视图添加到处理缩放的 UIScrollView)

这里有两张图片,第一张是屏幕上的内容,第二张是使用上面的截图代码保存的。(抱歉链接 - “作为垃圾邮件预防机制,新用户不得发布图片”)

http://www.flickr.com/photos/51983059@N08/8358662379/

http://www.flickr.com/photos/51983059@N08/8358662715/

感谢您的任何帮助!

4

1 回答 1

3

如果问题仍然相关。

我会认为插值是你在对象中设置的东西,它在上下文中绘制自己,但似乎上下文本身做了一些插值,它具有属性 CGInterpolationQuality 和 getter 和 setter。因此,对您的代码段的以下更改对我有用:

UIGraphicsBeginImageContextWithOptions([[UIApplication sharedApplication] keyWindow].bounds.size, NO, 0.0);
CGContextRef cgr = UIGraphicsGetCurrentContext();
CGContextSetInterpolationQuality(cgr, kCGInterpolationNone);
[self.view.layer renderInContext:cgr];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
于 2013-03-27T14:14:36.250 回答