2011-02-10 16 views

Odpowiedz

4

Około rok później, znalazłem odpowiedź:

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

To skutecznie generuje obraz hałasu, który jest gwarancją losowy i może być sporządzony za pomocą kodu z odpowiedzi Jason Harwig za .

+0

Należy pamiętać, że obraz zwracany z tej funkcji ma liczbę zatrzymań +1 i musi zostać zwolniony za pomocą CFRelease (obrazu) po zakończeniu rysowania. W przeciwnym razie przecieka. Również nazwa funkcji powinna zostać zmieniona, aby to odzwierciedlić. Powinien zawierać "nowy" lub "stworzyć" gdzieś. – Bryan

+0

Dzięki! Naprawiono przy pomocy 'CF_RETURNS_RETAINED'. –

3

Utwórz szum png, a następnie narysuj go za pomocą nakładki.

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

Z czystej grafiki rdzenia chciałem również narysować szum w Core Graphics ... Wymagania mojej aplikacji to, że nie używa plików png, niestety. –

+0

To dziwne wymaganie. Jako przyczynę rozumiałem niezależność rozdzielczości, ale wystarczy rozwiązać dwa różne png rozdzielczości. –

+0

Mimo to, to by działało ... Czy istnieje sposób, aby mocno zakodować UIImage jako dane tekstowe, które mogłem przywrócić z niestandardowej klasy? EDYTOWANIE: Czy nie byłbym w stanie utworzyć niestandardowej klasy opakowania z kodowaniem w formacie base64 obrazu w formacie Retina i napisać kilka prostych metod, aby zwrócić obraz w dowolnym rozmiarze/formacie? –

2

Istnieje CIRandomGenerator w CoreImageFilters od iOS 6. Należy jednak pamiętać, że nie jest to hałas gaussowski (jak nie jest w poprzedniej odpowiedzi).

- (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; 
} 
Powiązane problemy