仅使用核心图形的高斯噪声?

时间:2011-02-10 16:59:23

标签: cocoa core-graphics

我如何仅使用Core图形来生成噪声纹理背景?我被困在噪声部分,因为没有办法在核心图形中添加噪声滤波器...

3 个答案:

答案 0 :(得分:4)

大约一年后,我找到了答案:

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的答案中的代码绘制。

答案 1 :(得分:3)

创建一个噪音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);

答案 2 :(得分:2)

从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;
}