цветовой баланс на iPhone - PullRequest
2 голосов
/ 21 июля 2011

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

Код ниже показывает, как я снимаю изображение, получаю данные и прохожу значения r / g / b попиксельно:

CGImageRef sourceImage = theImage.image.CGImage;

CFDataRef theData;
theData = CGDataProviderCopyData(CGImageGetDataProvider(sourceImage));

UInt8 *pixelData = (UInt8 *) CFDataGetBytePtr(theData);

int dataLength = CFDataGetLength(theData);


int red = 0;
int green = 1;
int blue = 2;


for (int index = 0; index < dataLength; index += 4) {

    int r = pixelData[index + red];
    int g = pixelData[index + green];
    int b = pixelData[index + blue];

    // the color balancing would go here...

    if (r < 0) r = 0;
    if (g < 0) g = 0;
    if (b < 0) b = 0;

    if (r > 255) r = 255;
    if (g > 255) g = 255;
    if (b > 255) b = 255;

    pixelData[index + red] = r;
    pixelData[index + green] = g;
    pixelData[index + blue] = b;

}



CGContextRef context;
context = CGBitmapContextCreate(pixelData,
                                CGImageGetWidth(sourceImage),
                                CGImageGetHeight(sourceImage),
                                8,
                                CGImageGetBytesPerRow(sourceImage),
                                CGImageGetColorSpace(sourceImage),
                                kCGImageAlphaPremultipliedLast);

CGImageRef newCGImage = CGBitmapContextCreateImage(context);
UIImage *newImage = [UIImage imageWithCGImage:newCGImage];

CGContextRelease(context);
CFRelease(theData);
CGImageRelease(newCGImage);

theImage.image = newImage;

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

В Фотошопе я могу сделать это через:

Изображение: настройка: цветовой баланс и установив его на -30 0 0

Мне не удалось найти алгоритм или пример, объясняющий, как выполняется этот сдвиг цвета. Я пытался вычесть 30 из каждого красного значения или установить жесткий максимум на 255 - 30 (225), но они, кажется, обрезают цвета, а не смещают значения ... Прямо сейчас, я просто хакуюсь об этом , но указатели на ссылку очень помогли бы.

(Примечание: я не могу использовать решение OpenGL, потому что мне нужно взять тот же алгоритм и преобразовать его в PHP / gd для версии этого приложения на веб-сервере)

1 Ответ

3 голосов
/ 22 июля 2011

Что вам нужно сделать, это вычесть красный и затем исправить «легкость», чтобы соответствовать старому цвету, для любой меры света, которую вы выберете.Примерно так должно работать:

// First, calculate the current lightness.
float oldL = r * 0.30 + g * 0.59 + b * 0.11;

// Adjust the color components. This changes lightness.
r = r - 30;
if (r < 0) r = 0;

// Now correct the color back to the old lightness.
float newL = r * 0.30 + g * 0.59 + b * 0.11;
if (newL > 0) {
    r = r * oldL / newL;
    g = g * oldL / newL;
    b = b * oldL / newL;
}

Обратите внимание, что это ведет себя несколько странно, если дать чистый красный цвет (он не изменится).OTOH, GIMP (версия 2.6.11) делает то же самое в своем инструменте цветового баланса, поэтому я не слишком беспокоюсь об этом.

...