objective-c - 在 CGContext 中使用比例变换绘制平铺图像会产生精度误差

标签 objective-c core-graphics quartz-graphics

我想绘制平铺图像,然后使用常用的平移和缩放手势来转换它们。让我来到这里的问题是,每当我进行大量小数位的缩放变换时,图 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.7 scale

使用 0.777777 比例(将第 6 行更改为“float scale = 0.777777;”),会出现视觉伪像:

0.777777 scale

有什么办法可以避免这个问题吗?这种情况发生在 CGImage、CGLayer 和基本形式(例如矩形)上。 MacOSx 上也会发生这种情况。

感谢您的帮助!

编辑:补充说,这也会发生在原始表单中,例如 CGContextFillRect

edit2:MacOSx 上也会发生这种情况!

最佳答案

Quartz 具有浮点坐标系,因此缩放可能会导致值不在像素边界上,从而导致边缘出现可见的抗锯齿效果。如果您不希望这样,您有两个选择:

  1. 调整比例因子,使所有比例坐标都是整数。这可能并不总是可行,尤其是当您绘制很多东西时。

  2. 使用 CGContextSetShouldAntialias(UIGraphicsGetCurrentContext(), false); 禁用图形上下文的抗锯齿功能。这将导致清晰的像素边界,但除了直线之外的任何东西可能看起来不太好。

关于objective-c - 在 CGContext 中使用比例变换绘制平铺图像会产生精度误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12164144/

相关文章:

c++ - 将终端的输入/输出重定向到 iOS JB 中的 gui

ios - 由于未捕获的异常 'NSRangeException' 而终止应用程序,原因 : '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array

iphone - quartz 2d/核心图形 : What is the right way to draw some text?

c++ - 如何从自定义数据流编写 CoreGraphics CGImageRef?

iphone - 如何绘制旋转文本而不限于 MacRoman 字符集?

objective-c - NSComboBox - 获取选定的信息和 NSComboBoxDataSource

iOS:StatusBar 外观错误

ios - CAGradientLayer 边界没有改变

ios - drawRect 在 subview 之上

events - 事件点击 : Varying results with CGEventPost, kCGSessionEventTap, kCGAnnotatedSessionEventTap, CGEventTapPostEvent