Средний цвет экрана Mac - PullRequest
0 голосов
/ 27 декабря 2011

Я пытаюсь найти способ рассчитать средний цвет экрана, используя target-c.

Пока что я использую этот код, чтобы получить снимок экрана, который прекрасно работает:

CGImageRef image1 = CGDisplayCreateImage(kCGDirectMainDisplay);

NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:image1];
// Create an NSImage and add the bitmap rep to it...
NSImage *image = [[NSImage alloc] init];
[image addRepresentation:bitmapRep];

Теперь моя задача - вычислить средний цвет RGB этого изображения.

Я нашел одно решение, но компоненты цвета R G и B всегда рассчитывались как одинаковые (равные):

NSInteger i = 0;
NSInteger components[3] = {0,0,0};
unsigned char *data = [bitmapRep bitmapData];

NSInteger pixels = ([bitmapRep size].width *[bitmapRep size].height);

do {
    components[0] += *data++;
    components[1] += *data++;
    components[2] += *data++;
} while (++i < pixels);

int red = (CGFloat)components[0] / pixels;
int green = (CGFloat)components[1] / pixels;
int blue = (CGFloat)components[2] / pixels;

Ответы [ 2 ]

3 голосов
/ 27 декабря 2011

Краткий анализ bitmapRep показывает, что каждый пиксель имеет 32 бита (4 байта), где первый байт не используется, это байт заполнения, другими словами, формат XRGB и X не используется. (В конце строки пикселов нет байтов заполнения).

Еще одно замечание: для подсчета количества пикселей вы используете метод -(NSSize)size.
Вы никогда не должны делать это! Размер не имеет ничего общего с пикселями. Это только говорит о том, насколько большое изображение должно быть изображено (выражено в дюймах, см или мм) на экране или на принтере. Для подсчета (или использования иным образом) пикселей вы должны использовать -(NSInteger)pixelsWide и -(NSInteger)pixelsHigh. Но (неправильное) использование -size работает тогда и только тогда, когда разрешение imageRep составляет 72 точки на дюйм.

Наконец: есть похожий вопрос на Средний цвет экрана Mac

2 голосов
/ 27 декабря 2011

Ваши данные, вероятно, выровнены как 4 байта на пиксель (а не 3 байта, как вы предполагаете).Это (статистически) объясняет почти равные значения, которые вы получаете.

...