2011-02-10 10 views

Respuesta

4

Un año más tarde, he encontrado la respuesta:

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

Esto genera efectivamente una imagen de ruido que está garantizado a ser al azar, y se pueden extraer, utilizando el código de la respuesta de Jason Harwig .

+0

Tenga en cuenta que la imagen devuelta desde esta función tiene un conteo de retención de +1 y necesita ser liberado usando CFRelease (imagen) después de que termine de dibujarlo. De lo contrario, se filtra. Además, el nombre de la función debe cambiarse para reflejar esto. Debe contener "nuevo" o "crear" en algún lugar. – Bryan

+0

¡Gracias! Solucionado con 'CF_RETURNS_RETAINED'. –

3

Crea un ruido png, luego dibuja usando una mezcla de superposición.

// 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

Por Pure Core Graphics también quería hacer ruido en Core Graphics ... El requisito de mi aplicación es que no use archivos png, por desgracia. –

+0

Es un requisito extraño. Pude ver la independencia de la resolución como la razón, pero solo usar dos png de resolución diferente lo resolverá. –

+0

No obstante, eso funcionaría ... ¿Hay alguna manera de codificar el UIImage como datos de texto que podría traer de una clase personalizada? EDITAR: ¿No podría crear una clase contenedora personalizada con un valor codificado base64 de la imagen en formato Retina, y escribir algunos métodos simples para devolver la imagen en cualquier tamaño/formato? –

2

Hay una CIRandomGenerator en CoreImageFilters como de iOS 6. Pero hay que tener en cuenta que éste no es el ruido gaussiano (ya que no es en la respuesta anterior).

- (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; 
} 
Cuestiones relacionadas