Я беру изображение, загружаю его через контекст экрана и изменяю его попиксельно. У меня есть несколько различных фильтров, которые я применяю к изображениям, но последнее, что мне нужно сделать, это изменить цветовой баланс (аналогично 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 для версии этого приложения на веб-сервере)