Я хотел бы реализовать "автоматические уровни" опция для UIImage, который я отображаю в своем приложении для iPhone. Прежде чем я попытаюсь реализовать его сам, я задавался вопросом, существуют ли какие-либо методы обработки изображений в API, я должен использовать, для гистограмм, и т.д. Или я должен просто захватить базовый CGImage и обработать его? (Я плохо знаком с iPhone dev.)
Спасибо
МВ
Один очень простой подход - использовать массив декодирования CGImageRef, но это может помочь только для сопоставления диапазона (без гаммы и т. Д.)
const CGFloat decode[6] = {blackPoint,whitePoint,blackPoint,whitePoint,blackPoint,whitePoint};
decodedImage = CGImageCreate(CGImageGetWidth(origImage),
CGImageGetHeight(origImage),
CGImageGetBitsPerComponent(origImage),
CGImageGetBitsPerPixel(origImage),
CGImageGetBytesPerRow(origImage),
CGImageGetColorSpace(origImage),
CGImageGetBitmapInfo(origImage),
CGImageGetDataProvider(origImage),
decode,
YES,
CGImageGetRenderingIntent(origImage)
);
Где whitePoint - это число с плавающей запятой между 0,0 и 1,0, которое определяет, какой Яркость будет отображаться на чистый белый цвет на выходе, и blackPoint также является плавающим, который определяет, какая яркость сопоставлена с чистым черным.
Элементы массива декодирования соответствуют компонентам цветового пространства, поэтому этот код будет работать только для изображений RBG. Вы можете установить компоненты на разные значения белого и черного, чтобы создать простую цветокоррекцию.
Вы можете рассчитать whitePoint и blackPoint с помощью следующей функции (без цветокоррекции):
void CalculateAutocorretionValues(CGImageRef image, CGFloat *whitePoint, CGFloat *blackPoint) {
UInt8* imageData = malloc(100 * 100 * 4);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef ctx = CGBitmapContextCreate(imageData, 100, 100, 8, 4 * 100, colorSpace, kCGImageAlphaNoneSkipLast);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(ctx, CGRectMake(0, 0, 100, 100), image);
int histogramm[256];
bzero(histogramm, 256 * sizeof(int));
for (int i = 0; i < 100 * 100 * 4; i += 4) {
UInt8 value = (imageData[i] + imageData[i+1] + imageData[i+2]) / 3;
histogramm[value]++;
}
CGContextRelease(ctx);
free(imageData);
int black = 0;
int counter = 0;
// count up to 200 (2%) values from the black side of the histogramm to find the black point
while ((counter < 200) && (black < 256)) {
counter += histogramm[black];
black ++;
}
int white = 255;
counter = 0;
// count up to 200 (2%) values from the white side of the histogramm to find the white point
while ((counter < 200) && (white > 0)) {
counter += histogramm[white];
white --;
}
*blackPoint = 0.0 - (black / 256.0);
*whitePoint = 1.0 + ((255-white) / 256.0);
}
Я не думаю, что существуют существующие API для обработки изображений, но я уверен, что есть сторонние библиотеки.
Вы можете попробовать библиотеку CImg... У них есть histogram и equalize функции на docs. Функция equalize() дает довольно приличные результаты, судя по образцу изображения. Лицензия - LGPL, что может не подойти для вашего проекта, но совместимо с продажей в магазине приложений.