プログラム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);
}
基本的に、フィルターへの入力としてCIImage
を使用してinitを作成します。次に、それを描画するときに、(範囲は常にまたは0)を使用してそれを作成し、コンテキストに描画します。CIRandomGenerator
CIColorMonochrome
CGImageRef
self.bounds
infinite
結果はほとんど問題ありませんが、画像でわかるように、ストレッチが行われているようです。ここで何が起きてるの?