【问题标题】:Gaussian Noise using Core Graphics only?仅使用核心图形的高斯噪声?
【发布时间】:2013-04-10 22:14:31
【问题描述】:

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

【问题讨论】:

    标签: cocoa core-graphics


    【解决方案1】:

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

    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”。
    • 谢谢!用CF_RETURNS_RETAINED 修复。
    【解决方案2】:

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

    【讨论】:

    • 通过纯 Core Graphics,我也想在 Core Graphics 中画出噪音……遗憾的是,我的应用程序要求它不使用 png 文件。
    • 这是一个奇怪的要求。我可以将分辨率独立性视为原因,但只需使用两个不同分辨率的 png 就可以解决这个问题。
    • 尽管如此,这会起作用...有没有办法将 UIImage 硬编码为文本数据,我可以从自定义类中带回来?编辑:我不能用 Retina 格式的图像的 base64 编码字符串创建一个自定义包装器类,并编写一些简单的方法来返回任何大小/格式的图像吗?
    • 然后简单地生成 CGImage,而不是使用 png 资源
    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-02-07
      • 2014-08-26
      • 2016-08-17
      • 2021-11-07
      • 1970-01-01
      • 2013-04-07
      • 2012-03-27
      • 2014-09-23
      • 1970-01-01
      相关资源
      最近更新 更多