我想绘制平铺图像,然后使用常用的平移和缩放手势来转换它们。让我来到这里的问题是,每当我进行大量小数位的缩放变换时,图 block 中间就会出现一条细线像素(1 或 2)。我设法像这样隔离问题:
CGContextSaveGState(UIGraphicsGetCurrentContext());
CGContextSetFillColor(UIGraphicsGetCurrentContext(), CGColorGetComponents([UIColor redColor].CGColor));
CGContextFillRect(UIGraphicsGetCurrentContext(), rect);//rect from drawRect:
float scale = 0.7;
CGContextScaleCTM(UIGraphicsGetCurrentContext(), scale, scale);
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(50, 50, 100, 100), testImage);
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(150, 50, 100, 100), testImage);
CGContextRestoreGState(UIGraphicsGetCurrentContext());
使用 0.7 比例时,两个图像正确平铺显示:
使用 0.777777 比例(将第 6 行更改为“float scale = 0.777777;”),会出现视觉伪像:
有什么办法可以避免这个问题吗?这种情况发生在 CGImage、CGLayer 和基本形式(例如矩形)上。 MacOSx 上也会发生这种情况。
感谢您的帮助!
编辑:补充说,这也会发生在原始表单中,例如 CGContextFillRect
edit2:MacOSx 上也会发生这种情况!
最佳答案
Quartz 具有浮点坐标系,因此缩放可能会导致值不在像素边界上,从而导致边缘出现可见的抗锯齿效果。如果您不希望这样,您有两个选择:
调整比例因子,使所有比例坐标都是整数。这可能并不总是可行,尤其是当您绘制很多东西时。
使用
CGContextSetShouldAntialias(UIGraphicsGetCurrentContext(), false);
禁用图形上下文的抗锯齿功能。这将导致清晰的像素边界,但除了直线之外的任何东西可能看起来不太好。
关于objective-c - 在 CGContext 中使用比例变换绘制平铺图像会产生精度误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12164144/