6
votes

Bruit gaussien utilisant des graphiques de base uniquement?

Comment utiliserais-je des graphismes de base que pour générer un fond de texture de bruit? Je suis bloqué sur la partie de bruit car il n'ya aucun moyen d'ajouter un filtre de bruit dans les graphiques de base ...


0 commentaires

3 Réponses :


3
votes

Créez un PNG de bruit, puis tirez-le à l'aide d'un mélange de superposition.

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

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


4 commentaires

Par Pure Core Graphics, je voulais aussi dessiner le bruit dans les graphismes principaux ... L'exigence de mon application est qu'elle n'utilise aucun fichier PNG, malheureusement.


C'est une exigence étrange. Je pouvais voir l'indépendance de la résolution comme la raison, mais il suffit d'utiliser deux résolution différentes résolver cela.


Néanmoins, cela fonctionnerait ... Y a-t-il un moyen d'encoder l'uiimage en tant que données de texte que je pouvais ramener d'une classe personnalisée? EDIT: Je ne serais pas capable de créer une classe wrapper personnalisée avec une piqode codée de base64 de l'image en format de rétine et écrivez quelques méthodes simples pour renvoyer l'image dans une taille / format?


alors simplement générer le CGIMAGE, plutôt que d'utiliser une ressource PNG



4
votes

Environ un an plus tard, j'ai trouvé la réponse:

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


2 commentaires

Notez que l'image renvoyée à partir de cette fonction contient un nombre de retenue +1 et doit être libérée à l'aide de Cfrelease (image) après avoir terminé la dessin. Sinon, il fuit. De plus, le nom de la fonction doit être modifié pour refléter ceci. Il devrait contenir «nouveau» ou «créer» quelque part.


Merci! Corrigé avec cf_returns_rettenue .