Objective c Mac屏幕的平均颜色

Objective c Mac屏幕的平均颜色,objective-c,macos,image,image-processing,Objective C,Macos,Image,Image Processing,我试图找到一种方法,用objective-c计算屏幕的平均颜色 到目前为止,我使用此代码获取屏幕截图,效果非常好: CGImageRef image1 = CGDisplayCreateImage(kCGDirectMainDisplay); NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:image1]; // Create an NSImage and add the bitmap rep to

我试图找到一种方法,用objective-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颜色

我找到了一种解决方案,但RG和B颜色分量始终计算为相同(相等):

NSInteger i=0;
NSInteger组件[3]={0,0,0};
无符号字符*数据=[bitmapRep bitmapData];
NSInteger像素=([bitmapRep大小].宽度*[bitmapRep大小].高度);
做{
组件[0]+=*数据++;
组件[1]+=*数据++;
组件[2]+=*数据++;
}而(++i<像素);
int red=(CGFloat)组件[0]/像素;
int绿色=(CGFloat)组件[1]/像素;
int blue=(CGFloat)组件[2]/像素;

您的数据可能按每像素4个字节对齐(而不是像您假设的那样3个字节)。这可以(从统计学上)解释你得到的近似相等的值

您的数据可能按每像素4个字节对齐(而不是像您假设的那样3个字节)。这可以(从统计学上)解释你得到的近似相等的值

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

另一个备注:要计算像素数,请使用方法
-(NSSize)size

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


最后:在

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

另一个备注:要计算像素数,请使用方法
-(NSSize)size

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


最后:在

中有一个类似的问题,它们是否为零?或者三个通道的值是什么?您的算法假设a)像素内的每个通道i)适合
无符号字符,ii)存储为整数,b)通道以RGB顺序存储,没有alpha分量。你确定这些都是真的吗?你知道
bitsPerPixel
samplespepixel
的值吗?它总是给我红色、绿色和蓝色相等的值。红色=87绿色=87蓝色=87乔希,不,我不确定。基本上,我需要一种方法来找到获得屏幕平均RGB颜色的最佳方法。有关优化方法,请参阅。它的速度大约是对像素数据进行迭代的四倍。它们是零吗?或者三个通道的值是什么?您的算法假设a)像素内的每个通道i)适合
无符号字符,ii)存储为整数,b)通道以RGB顺序存储,没有alpha分量。你确定这些都是真的吗?你知道
bitsPerPixel
samplespepixel
的值吗?它总是给我红色、绿色和蓝色相等的值。红色=87绿色=87蓝色=87乔希,不,我不确定。基本上,我需要一种方法来找到获得屏幕平均RGB颜色的最佳方法。有关优化方法,请参阅。它的速度大约是迭代像素数据的四倍。谢谢。我该如何解决这个问题?但这是否解释了为什么我总是让红、绿、蓝三种颜色相等呢?谢谢。我该如何解决这个问题?但这是否解释了为什么我总是让红色、绿色和蓝色相等?我应该如何更改代码来解决这个问题?(关于4字节而不是字节)你的链接是类似的问题,这让我想到了我自己的(这个)问题。最简单(也是最难看)的方法是添加
data++作为do循环中的第一条语句。它跳过第一个(未使用的)字节。如果未使用像素的最后一个字节,则添加
data++作为do循环中的最后一条语句。当然,对所有像素进行更仔细的迭代是可取的。我应该如何更改代码来解决这个问题?(关于4字节而不是字节)你的链接是类似的问题,这让我想到了我自己的(这个)问题。最简单(也是最难看)的方法是添加
data++作为do循环中的第一条语句。它跳过第一个(未使用的)字节。如果未使用像素的最后一个字节,则添加
data++作为do循环中的最后一条语句。当然,最好对所有像素进行更仔细的迭代。
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;