Гауссовский шум только с использованием Core Graphics? - PullRequest
5 голосов
/ 10 февраля 2011

Как бы я использовал графику Core только для генерации фоновой текстуры шума? Я застрял в части шума, потому что нет никакого способа добавить фильтр шума в графике ядра ...

Ответы [ 3 ]

4 голосов
/ 17 декабря 2012

Примерно через год я нашел ответ:

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

Это эффективно генерирует изображение шума, которое гарантированно будет случайным и может быть нарисовано, используя код из ответа Джейсона Харвига.

3 голосов
/ 10 февраля 2011

Создайте шум 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 голосов
/ 10 апреля 2013

CIRandomGenerator есть в CoreImageFilters с iOS 6. Но имейте в виду, что это не гауссовский шум (как в предыдущем ответе).

- (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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...