我正在編程創建一個CALayer
子類,它將自己的像素噪聲應用到位。該代碼的工作原理是它在圖層中呈現噪點,但圖像上有一個奇怪的工件,我無法確定根本原因。使用Core Image呈現隨機噪聲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
濾波器創建在初始化的CIImage
。然後,當它繪製它時,我使用self.bounds
(範圍是總是或0)創建一個CGImageRef
,並將其繪製到上下文中。
結果大部分都很好,但正如您在圖片中看到的那樣,似乎正在進行一些延伸。這裏發生了什麼?
這有點晚,但是您發佈的代碼與圖片不符。在我的iPad Mini和模擬器中,這個類可以達到預期的效果:隨機噪聲層。請張貼實際重現錯誤的代碼。 – alecail
它在發佈時做過。您可能正在使用不同的操作系統或SDK。請參閱下面的解決方案 – coneybeare