径向 CGGradient 中的严重色带
Harsh colour banding in radial CGGradient
CGContextDrawRadialGradient
在渐变的中心产生一个非常明显的“十字”:
代码(简化):
- (void)drawRect:(NSRect)dirtyRect {
CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort];
size_t numberOfGradientLocations = 2;
CGFloat startRadius = 0.0f;
CGFloat endRadius = 30.0f;
CGPoint centre = CGPointMake(floorf(self.bounds.size.width / 2), floorf(self.bounds.size.height / 2));
CGFloat gradientColours[8] = {0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f};
CGFloat gradientLocations[2] = {0.0f, 1.0f};
CGColorSpaceRef colourspace = CGColorSpaceCreateDeviceRGB();
CGGradientRef gradient = CGGradientCreateWithColorComponents(colourspace, gradientColours, gradientLocations, numberOfGradientLocations);
CGContextDrawRadialGradient(context, gradient, centre, startRadius, centre, endRadius, kCGGradientDrawsBeforeStartLocation);
}
这在 macOS 和 iOS 上都会发生。同时,相同类型的渐变在 WebKit 中完美呈现 CSS(所以这不是一些“显示不佳”的问题)。
我做错了什么?有解决这个问题的已知方法吗?
这是我在 iOS 上看到的;我使用 iPhone 7 Plus 模拟器 100% 使每个像素都可见,看起来非常平滑:
编辑 经过一些实验,我怀疑您看到的是点和像素之间未对齐造成的摩尔纹效果。
CGContextDrawRadialGradient
在渐变的中心产生一个非常明显的“十字”:
代码(简化):
- (void)drawRect:(NSRect)dirtyRect {
CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort];
size_t numberOfGradientLocations = 2;
CGFloat startRadius = 0.0f;
CGFloat endRadius = 30.0f;
CGPoint centre = CGPointMake(floorf(self.bounds.size.width / 2), floorf(self.bounds.size.height / 2));
CGFloat gradientColours[8] = {0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f};
CGFloat gradientLocations[2] = {0.0f, 1.0f};
CGColorSpaceRef colourspace = CGColorSpaceCreateDeviceRGB();
CGGradientRef gradient = CGGradientCreateWithColorComponents(colourspace, gradientColours, gradientLocations, numberOfGradientLocations);
CGContextDrawRadialGradient(context, gradient, centre, startRadius, centre, endRadius, kCGGradientDrawsBeforeStartLocation);
}
这在 macOS 和 iOS 上都会发生。同时,相同类型的渐变在 WebKit 中完美呈现 CSS(所以这不是一些“显示不佳”的问题)。
我做错了什么?有解决这个问题的已知方法吗?
这是我在 iOS 上看到的;我使用 iPhone 7 Plus 模拟器 100% 使每个像素都可见,看起来非常平滑:
编辑 经过一些实验,我怀疑您看到的是点和像素之间未对齐造成的摩尔纹效果。