2011-02-10 3 views

ответ

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

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

+0

Обратите внимание, что изображение, возвращенное из этой функции, имеет счет сохранения +1 и должно быть выпущено с использованием CFRelease (изображения) после того, как вы закончите рисовать его. В противном случае он протекает. Кроме того, имя функции следует изменить, чтобы отразить это. Он должен содержать где-то «новое» или «создать». – Bryan

+0

Спасибо! Исправлено с 'CF_RETURNS_RETAINED'. –

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 Я хотел также нарисовать шум в Core Graphics ... Требование моего приложения заключается в том, что он не использует файлы png, к сожалению. –

+0

Это странное требование. Я мог видеть независимость разрешения как причину, но просто использование двух разных png разрешений решит это. –

+0

Тем не менее, это сработает ... Есть ли способ жестко кодировать UIImage как текстовые данные, которые я мог бы вернуть из пользовательского класса? EDIT: не смог ли я создать собственный класс-оболочку с кодировкой с кодировкой base64 изображения в формате Retina и написать несколько простых методов для возврата изображения в любом размере/формате? –

2

Существует 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; 
} 
Смежные вопросы