只使用核心图形处理技术如何实现高斯噪声?

6

我该如何使用Core Graphics来生成噪声纹理背景?我在噪声部分卡住了,因为在Core Graphics中没有添加噪声滤镜的方法...

3个回答

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的保留计数,并且在绘制完成后需要使用CFRelease(image)释放。否则会造成内存泄漏。另外,函数的名称应更改以反映这一点。它应该包含“new”或“create”等字样。 - Bryan
谢谢!已使用CF_RETURNS_RETAINED修复。 - Aditya Vaidyam

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);

1
我想使用纯Core Graphics来绘制噪点。但是我的应用程序要求不使用png文件,这让我很遗憾。 - Aditya Vaidyam
这是一个奇怪的要求。我可以理解分辨率独立性是原因,但只需使用两个不同分辨率的PNG文件即可解决问题。 - Jason Harwig
尽管如此,那应该可以……有没有一种方法将UIImage硬编码为文本数据,以便我可以从自定义类中带回?编辑:我不能创建一个自定义包装器类,其中包含Retina格式图像的base64编码字符串,并编写几个简单的方法以返回任何大小/格式的图像吗? - Aditya Vaidyam
1
只需生成CGImage,而不是使用png资源。 - justin

3

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接