【发布时间】:2026-02-25 14:15:02
【问题描述】:
我正在以编程方式创建一个CALayer 子类,该子类对其自身应用一点像素噪声。该代码的工作原理是它在图层中呈现噪点,但图像上有一个奇怪的伪影,我无法确定根本原因。
这是一张带有noiseOpacity 的示例图片,以使问题更加明显。
粉色框是UANoisyGradientLayer,是CAGradientLayer 的子类,包含以下位:
@interface UANoisyGradientLayer ()
@property (nonatomic, retain) CIContext *noiseContext;
@property (nonatomic, retain) CIFilter *noiseGenerator;
@property (nonatomic, retain) CIImage *noiseImage;
@end
@implementation UANoisyGradientLayer
@synthesize noiseOpacity = _noiseOpacity, noiseImage;
- (id)init {
self = [super init];
if (self) {
self.noiseOpacity = 0.10;
self.noiseContext = [CIContext contextWithOptions:nil];
self.noiseGenerator = [CIFilter filterWithName:@"CIColorMonochrome"];
[self.noiseGenerator setValue:[[CIFilter filterWithName:@"CIRandomGenerator"] valueForKey:@"outputImage"] forKey:@"inputImage"];
[self.noiseGenerator setDefaults];
self.noiseImage = [self.noiseGenerator outputImage];
}
return self;
}
- (void)drawInContext:(CGContextRef)ctx {
[super drawInContext:ctx];
CGRect extentRect = [self.noiseImage extent];
if (CGRectIsInfinite(extentRect) || CGRectIsEmpty(extentRect)) {
extentRect = self.bounds;
}
CGImageRef cgimg = [self.noiseContext createCGImage:self.noiseImage fromRect:extentRect];
CGContextSetBlendMode(ctx, kCGBlendModeOverlay);
CGContextSetAlpha(ctx, self.noiseOpacity);
CGContextDrawImage(ctx, self.bounds, cgimg);
CGImageRelease(cgimg);
}
基本上,我使用CIRandomGenerator 作为CIColorMonochrome 过滤器的输入在init 中创建CIImage。然后,当需要绘制它时,我使用self.bounds(范围为always infinite 或0)从中创建一个CGImageRef,并将其绘制到上下文中。
结果大部分都很好,但正如您在图像中看到的那样,似乎有一些拉伸正在发生。这里发生了什么?
【问题讨论】:
-
有点晚了,但是你贴的代码和图片不符。在我的 iPad Mini 和模拟器中,这个类做了预期的事情:一个带有随机噪声的层。请发布实际重现错误的代码。
-
发帖时确实如此。您可能正在使用不同的操作系统或 SDK。请参阅下面的解决方案。
标签: ios core-image noise cifilter ciimage