В UIImage (или его производных), как я могу заменить один цвет другим? - PullRequest
2 голосов
/ 12 августа 2009

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

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

Спасибо!

1 Ответ

9 голосов
/ 12 августа 2009

Хорошо, мы получили 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;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...