【发布时间】:2013-04-10 22:14:31
【问题描述】:
我将如何仅使用 Core 图形来生成噪声纹理背景?我被困在噪音部分,因为没有办法在核心图形中添加噪音过滤器......
【问题讨论】:
标签: cocoa core-graphics
我将如何仅使用 Core 图形来生成噪声纹理背景?我被困在噪音部分,因为没有办法在核心图形中添加噪音过滤器......
【问题讨论】:
标签: cocoa core-graphics
大约一年后,我找到了答案:
CGImageRef CGGenerateNoiseImage(CGSize size, CGFloat factor) CF_RETURNS_RETAINED {
NSUInteger bits = fabs(size.width) * fabs(size.height);
char *rgba = (char *)malloc(bits);
srand(124);
for(int i = 0; i < bits; ++i)
rgba[i] = (rand() % 256) * factor;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
CGContextRef bitmapContext = CGBitmapContextCreate(rgba, fabs(size.width), fabs(size.height),
8, fabs(size.width), colorSpace, kCGImageAlphaNone);
CGImageRef image = CGBitmapContextCreateImage(bitmapContext);
CFRelease(bitmapContext);
CGColorSpaceRelease(colorSpace);
free(rgba);
return image;
}
这有效地生成了保证随机的噪声图像,并且可以使用 Jason Harwig 的答案中的代码进行绘制。
【讨论】:
CF_RETURNS_RETAINED 修复。
创建一个噪声 png,然后使用叠加混合绘制它。
// draw background
CGContextFillRect(context, ...)
// blend noise on top
CGContextSetBlendMode(context, kCGBlendModeOverlay);
CGImageRef cgImage = [UIImage imageNamed:@"noise"].CGImage;
CGContextDrawImage(context, rect, cgImage);
CGContextSetBlendMode(context, kCGBlendModeNormal);
【讨论】:
从 iOS 6 开始,CoreImageFilters 中有一个 CIRandomGenerator。 但请记住,这不是高斯噪声(因为它不在上一个答案中)。
- (UIImage*)linearRandomImage:(CGRect)rect
{
CIContext *randomContext = [CIContext contextWithOptions:nil];
CIFilter *randomGenerator = [CIFilter filterWithName: @"CIColorMonochrome"];
[randomGenerator setValue:[[CIFilter filterWithName:@"CIRandomGenerator"] valueForKey:@"outputImage"] forKey:@"inputImage"];
[randomGenerator setDefaults];
CIImage *resultImage = [randomGenerator outputImage];
CGImageRef ref = [randomContext createCGImage:resultImage fromRect:rect];
UIImage *endImage=[UIImage imageWithCGImage:ref];
return endImage;
}
【讨论】: