我需要渲染没有消除锯齿的UIBezierPaths,然后将它们保存为PNG以保留完整的像素表示(例如,不要让JPEG将图像弄乱)。我在尝试触摸UIBezierPaths之前尝试调用下面的CG函数,但似乎没有对生成的渲染图像产生任何影响。仍然使用抗锯齿(即平滑)渲染路径。
CGContextSetShouldAntialias(c, NO);
CGContextSetAllowsAntialiasing(c, NO);
CGContextSetInterpolationQuality(c, kCGInterpolationNone);
任何点击都会非常感激。
答案 0 :(得分:13)
当我使用这些选项时,它会关闭抗锯齿功能。左侧是默认选项。在右边,有你的选择。
如果您使用UIView
子类,这很容易控制。这是我的drawRect
:
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetShouldAntialias(context, NO);
[[UIColor redColor] setStroke];
UIBezierPath *path = [self myPath];
[path stroke];
}
从How to take a screenshot programmatically
捕获屏幕- (void)captureScreen
{
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
UIGraphicsBeginImageContextWithOptions(self.window.bounds.size, NO, [UIScreen mainScreen].scale);
else
UIGraphicsBeginImageContext(self.window.bounds.size);
[self.window.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *data = UIImagePNGRepresentation(image);
[data writeToFile:[self screenShotFilename] atomically:YES];
}
如果您使用的是CAShapeLayer
,那么我认为您无法在屏幕上控制抗锯齿,因为as the documentation says:
将绘制抗锯齿形状,并在可能的情况下将其映射到屏幕空间,然后进行栅格化以保持分辨率独立性。但是,应用于图层或其祖先的某些图像处理操作(如CoreImage滤镜)可能会强制在局部坐标空间中进行光栅化。
但是,无论屏幕上的抗锯齿如何,如果您想让屏幕快照不被抗锯齿,您可以将CGContextSetShouldAntialias
插入captureScreen
例程:
- (void)captureScreen
{
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
UIGraphicsBeginImageContextWithOptions(self.window.bounds.size, NO, [UIScreen mainScreen].scale);
else
UIGraphicsBeginImageContext(self.window.bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetShouldAntialias(context, NO);
[self.window.layer renderInContext:context];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData * data = UIImagePNGRepresentation(image);
[data writeToFile:[self screenShotFilename] atomically:YES];
}
答案 1 :(得分:5)
你从哪里获得c
?您确定c
与您使用UIGraphicsGetCurrentContext()
的绘图周期中的[UIBezierPath stroke]
引用的内容相同吗?从上面的例子中很难说清楚。
如果您想确定要绘制的是与您配置相同的上下文,请从CGPath
中获取UIBezierPath
,然后直接绘制:
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicGetCurrentContext();
CGPathRef path = [self.bezier CGPath];
CGContextSetShouldAntialias(context, NO);
CGContextAddPath(context, path);
CGContextStrokePath(context);
}