2009-08-11 9 views
2

Zum Beispiel habe ich ein UIImage (von dem ich ein CGImage, CGLayer, etc., wenn benötigt), und ich möchte alle roten Pixel (1, 0, 0) mit blau (0, 0 ersetzen , 1).Wie kann ich in einem UIImage (oder seinen Derivaten) eine Farbe durch eine andere ersetzen?

Ich habe Code, um herauszufinden, welche Pixel sind die Zielfarbe (siehe this SO question & answer), und ich kann die entsprechenden Werte in RawData ersetzen, aber (a) Ich bin mir nicht sicher, wie ich einen UIImage von meinem RawData-Puffer und erhalten (b) es scheint so, als ob ich eine eingebaute Einheit vermisse, die all das automatisch für mich tut und mir Unmengen von Trauer erspart.

Danke!

Antwort

9

Ok, also haben wir die UIImage in einen rawBits-Puffer gebracht (siehe Link in der Originalfrage), dann haben wir die Daten im Puffer nach unseren Wünschen gezwirbelt (dh alle roten Komponenten (jedes 4. Byte) auf 0 gesetzt , als Test), und müssen jetzt eine neue UIImage erhalten, die die gezwirbelten Daten darstellt.

Ich fand die Antwort in Erica Sudan's iPhone Cookbook, Kapitel 7 (Bilder), Beispiel 12 (Bitmaps). Der entsprechende Aufruf war CGBitmapContextCreate() und der entsprechende Code war:

+ (UIImage *) imageWithBits: (unsigned char *) bits withSize: (CGSize) 
size 
{ 
    // Create a color space 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    if (colorSpace == NULL) 
    { 
     fprintf(stderr, "Error allocating color space\n"); 
     free(bits); 
     return nil; 
    } 

    CGContextRef context = CGBitmapContextCreate (bits, size.width, 
size.height, 8, size.width * 4, colorSpace, 
kCGImageAlphaPremultipliedFirst); 
    if (context == NULL) 
    { 
     fprintf (stderr, "Error: Context not created!"); 
     free (bits); 
     CGColorSpaceRelease(colorSpace); 
     return nil; 
    } 

    CGColorSpaceRelease(colorSpace); 
    CGImageRef ref = CGBitmapContextCreateImage(context); 
    free(CGBitmapContextGetData(context)); 
    CGContextRelease(context); 

    UIImage *img = [UIImage imageWithCGImage:ref]; 
    CFRelease(ref); 
    return img; 
} 

Hoffnung, die Zukunft Website spelunkers nützlich ist!

+1

Schade, dass nicht viele Menschen diese Art von Funktion verwenden, Sie verdienen mehr Kredit dafür. –

Verwandte Themen