9 Stimmen

durchschnittlicher Farbwert von UIImage in Objective-C

Ich benötige den durchschnittlichen Farbwert eines Bildes in Objective C. Ich möchte daraus einen Farbverlauf erstellen. Hat jemand eine Idee?

15voto

Alkimake Punkte 1797

Hier ist ein experimenteller Code, den ich noch nicht getestet habe.

struct pixel {
    unsigned char r, g, b, a;
};

- (UIColor*) getDominantColor:(UIImage*)image
{
    NSUInteger red = 0;
    NSUInteger green = 0;
    NSUInteger blue = 0;

    // Allocate a buffer big enough to hold all the pixels

    struct pixel* pixels = (struct pixel*) calloc(1, image.size.width * image.size.height * sizeof(struct pixel));
    if (pixels != nil)
    {

        CGContextRef context = CGBitmapContextCreate(
                                                 (void*) pixels,
                                                 image.size.width,
                                                 image.size.height,
                                                 8,
                                                 image.size.width * 4,
                                                 CGImageGetColorSpace(image.CGImage),
                                                 kCGImageAlphaPremultipliedLast
                                                 );

        if (context != NULL)
        {
            // Draw the image in the bitmap

            CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, image.size.width, image.size.height), image.CGImage);

            // Now that we have the image drawn in our own buffer, we can loop over the pixels to
            // process it. This simple case simply counts all pixels that have a pure red component.

            // There are probably more efficient and interesting ways to do this. But the important
            // part is that the pixels buffer can be read directly.

            NSUInteger numberOfPixels = image.size.width * image.size.height;
            for (int i=0; i<numberOfPixels; i++) {
                red += pixels[i].r;
                green += pixels[i].g;
                blue += pixels[i].b;
            }

            red /= numberOfPixels;
            green /= numberOfPixels;
            blue/= numberOfPixels;

            CGContextRelease(context);
        }

        free(pixels);
    }
    return [UIColor colorWithRed:red/255.0f green:green/255.0f blue:blue/255.0f alpha:1.0f];
}

Sie können diese Methode z. B. verwenden;

-(void)doSomething
{
    UIImage *image = [UIImage imageNamed:@"someImage.png"];
    UIColor *dominantColor = [self getDominantColor:image];
}

Ich hoffe, dass dies für Sie funktioniert.

Sie können auch in UIImage mit Kategorie implementieren. Besserer Weg, um einige Dienstprogramme für Objekte zu schreiben :)

Editar : Der Fehler in while() .

-1voto

Surjeet Rajput Punkte 1151

Es gibt eine Methode, um die Durchschnittsfarbe aus einem Bild zu erstellen.

[UIColor colorWithAverageColorFromImage:(UIImage *)image];

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