我遇到屏幕截图(以编程方式使用下面的代码)与图像放大(在我的情况下非常远)时实际在屏幕上显示的内容之间的不一致,以及渲染最近邻居以保留硬边缘。我从这些论坛获得了以下截图代码,但保存的是(双线性?)渲染图像而不是最近邻居。
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/
感谢您的帮助!
答案 0 :(得分:3)
如果问题仍然相关。
我原本以为插值是你在上下文中绘制自己的对象中设置的东西,但似乎上下文本身做了一些插值,它具有带吸气器和设置器的CGInterpolationQuality属性。因此,以下对您的代码段的更改对我有用:
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);