6 Stimmen

Gaußsches Rauschen nur mit Core Graphics?

Wie würde ich Core-Grafiken verwenden, um einen Hintergrund mit Rauschtexturen zu erzeugen? Ich bin auf das Rauschen Teil stecken, weil es keine Möglichkeit, einen Rauschfilter in Core Graphics hinzufügen...

4voto

Aditya Vaidyam Punkte 6129

Etwa ein Jahr später habe ich die Antwort gefunden:

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

Dadurch wird ein Rauschbild erzeugt, das garantiert zufällig ist und mit dem Code aus Jason Harwigs Antwort gezeichnet werden kann.

3voto

Jason Harwig Punkte 40107

Erstellen Sie ein Rausch-Png und zeichnen Sie es dann mit einer Überlagerungsmischung.

// draw background
CGContextFillRect(context, ...)

// blend noise on top
CGContextSetBlendMode(context, kCGBlendModeOverlay);
CGImageRef cgImage = [UIImage imageNamed:@"noise"].CGImage;
CGContextDrawImage(context, rect, cgImage);
CGContextSetBlendMode(context, kCGBlendModeNormal);

3voto

Es gibt einen CIRandomGenerator in CoreImageFilters ab iOS 6. Aber bedenken Sie, dass es sich hierbei nicht um gaußsches Rauschen handelt (wie auch nicht in der vorherigen Antwort).

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X