在 iOS 中,如何在没有抗锯齿/插值的情况下绘制位图?

Posted

技术标签:

【中文标题】在 iOS 中,如何在没有抗锯齿/插值的情况下绘制位图?【英文标题】:How do I draw into a bitmap without antialiasing/interpolation in iOS? 【发布时间】:2013-05-14 20:16:40 【问题描述】:

我正在尝试像这样以编程方式绘制到 UIImage 中:

- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(2, 2), YES, 1);

    CGContextRef context = UIGraphicsGetCurrentContext();

    // These three lines of code apparently do nothing.
    CGContextSetInterpolationQuality(context, kCGInterpolationNone);
    CGContextSetAllowsAntialiasing(context, false);
    CGContextSetShouldAntialias(context, false);

    CGContextSetFillColorWithColor(context, [UIColor colorWithRed:1 green:0 blue:0 alpha:1].CGColor);
    CGContextFillRect(context, CGRectMake(0, 0, 1, 1));

    self.imageView.image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

此代码有效,只是生成的图像非常柔和,显然是由于抗锯齿/插值的积极尝试。我需要使用最近邻插值来缩放图像。如何防止这种抗锯齿?

谢谢!

【问题讨论】:

imageView 的边界是什么? 【参考方案1】:

虽然您绘制到上下文中的图像不使用抗锯齿(即使它实际上并没有对您绘制的特定图像产生影响),但您仍然可以从图像中获得默认的插值行为查看

要改变它,调整视图层的magnificationFilter/minificationFilter 属性:

self.imageView.layer.magnificationFilter = kCAFilterNearest;
self.imageView.layer.minificationFilter = kCAFilterNearest;

(您需要添加 QuartzCore 框架才能使其工作。)

【讨论】:

以上是关于在 iOS 中,如何在没有抗锯齿/插值的情况下绘制位图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有抗锯齿的情况下显示缩放图像?

如何在没有抗锯齿的情况下拉伸图像

在OpenGL中绘制到半透明帧缓冲区时如何抗锯齿? [复制]

为标签绘制抗锯齿椭圆区域

谷歌地图GroundOverlays默认情况下是不是具有抗锯齿功能?

在 OpenCV 中使用 CV_AA 标志绘制一条线不会产生抗锯齿线