2011-12-26 284 views
0

我试图找出一种方法来使用objective-c来计算屏幕的平均颜色。Mac Screen的平均颜色

到目前为止,我用这个代码来获得一个屏幕截图,伟大的工程:

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颜色。

我找到一个解决方案,但RG和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; 
+1

他们出来零?或者三个频道的价值是什么? – I82Much 2011-12-26 22:22:26

+0

你的算法假定:a)像素i)中的每个通道适合'unsigned char',ii)以整数存储,b)通道按RGB顺序存储,不含alpha分量。你确定所有这些事情都是真的吗?你知道'bitsPerPixel'和'samplesPerPixel'的值吗? – 2011-12-26 22:37:21

+0

它总是给我红色,绿色和蓝色值相等。例如,红色= 87绿色= 87蓝色= 87 乔希, 不,我不确定。基本上我需要一种方法来找到获得屏幕平均RGB颜色的最佳方式。 – 2011-12-27 10:33:09

回答

3

对bitmapRep的一个简短分析表明,每个像素有32位(4字节),其中第一个字节未被使用,它是一个填充字节,换句话说,格式是XRGB,X未被使用。 (像素行末尾没有填充字节)。

另一种说法:用于计算您使用方法-(NSSize)size的像素数量。
你不应该这样做!大小与像素无关。它只是说在屏幕或打印机上应该显示图像的大小(用英寸或厘米或毫米表示)。为了计算(或使用其他方式)像素,您应该使用-(NSInteger)pixelsWide-(NSInteger)pixelsHigh。但是,当且仅当imageRep的分辨率是每英寸72点时,-size的(错误)使用才有效。

终于:还有类似的问题在Average Color of Mac Screen

+0

我应该如何更改我的代码来解决此问题? (关于4而不是字节) 你的链接是类似的问题,导致我自己的(这个)问题。 – 2011-12-28 11:56:16

+2

最简单(也是最丑陋)的方法是在do循环中添加'data ++;'作为第一条语句。这跳过了第一个(未使用的)字节。如果不使用像素的最后一个字节,则在do循环中添加'data ++;'作为最后一个语句。对所有像素进行更仔细的迭代当然更可取。 – 2011-12-29 10:17:22

+0

非常感谢,它就像一个魅力! – 2011-12-30 18:53:47

2

你的数据可能是对齐,每像素4个字节(而不是3字节,就像你所假设的那样)。这将(统计)解释你得到的几乎相等的值。

+0

谢谢。我将如何解决这个问题?但这是否解释了为什么我总是得到红色,绿色和蓝色是平等的? – 2011-12-27 10:33:48