Как в UIImage (или его производных) заменить один цвет другим?

Например, у меня есть UIImage (из которого я могу получить CGImage, CGLayer и т. д., если это необходимо), и я хочу заменить все красные пиксели (1, 0, 0) синими (0, 0, 1). ).

У меня есть код, чтобы выяснить, какие пиксели являются целевым цветом (см. это ТАК вопрос и ответ), и я могу подставить соответствующие значения в rawData, но (а) я не уверен, как получить UIImage обратно из моего буфера rawData и (б) кажется, что мне может не хватать встроенной функции, которая будет делать все это автоматически, избавляя меня от горя.

Спасибо!


person Olie    schedule 11.08.2009    source источник


Ответы (1)


Итак, мы поместили UIImage в буфер rawBits (см. ссылку в исходном вопросе), затем мы изменили данные в буфере по своему вкусу (т.е. установили все красные компоненты (каждый 4-й байт) в 0, в качестве теста ), и теперь нужно получить новый UIImage, представляющий измененные данные.

Я нашел ответ в Поваренной книге Эрики Судан для iPhone, глава 7 (изображения), пример 12 (растровые изображения). Соответствующий вызов был CGBitmapContextCreate(), и соответствующий код был таким:

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

Надеюсь, это будет полезно для будущих спелеологов сайта!

person Olie    schedule 11.08.2009
comment
Жаль, что не так много людей используют эту функцию, вы заслуживаете большей похвалы за это. - person Luke Mcneice; 22.10.2010