2

我正在开发一个需要比较两个图像的应用程序,以查看它们的不同之处,并且该应用程序对不同的图像重复执行此操作。所以我目前这样做的方法是将两个图像都设置为NSBitmapImageRep,然后使用该colorAtX: y:函数来获取一个NSColor对象,然后检查 RGB 分量。但是这种方法非常缓慢。因此,在互联网上进行研究时,我发现帖子说更好的方法是使用函数 bitmapData 获取位图数据,该函数返回一个无符号字符。对我来说不幸的是,我不知道如何从这里进一步发展,而且我发现的所有帖子都没有向您展示如何从中实际获取每个像素的 RGB 分量bitmapData。所以目前我有:

 NSBitmapImageRep* imageRep = [self screenShot]; //Takes a screenshot of the content displayed in the nswindow
unsigned char *data = [imageRep bitmapData]; //Get the bitmap data

//What do I do here in order to get the RGB components?

谢谢

4

1 回答 1

5

您从-bitmapData指向 RGB 像素数据的指针返回。您必须查询图像代表以查看它的格式。您可以使用该-bitmapFormat方法告诉您数据是第一个还是最后一个(RGBA 或 ARGB),以及像素是整数还是浮点数。您需要检查每个像素有多少样本等。这是文档。如果您对数据格式有更具体的问题,请发布这些问题,我们可以尝试帮助回答这些问题。

通常数据是非平面的,这意味着它只是交错的 RGBA(或 ARGB)数据。您可以像这样循环它(假设每个通道 8 位,4 个数据通道):

int width = [imageRep pixelsWide];
int height = [imageRep pixelsHight];
int rowBytes = [imageRep bytesPerRow];
char* pixels = [imageRep bitmapData];
int row, col;
for (row = 0; row < height; row++)
{
    unsigned char* rowStart = (unsigned char*)(pixels + (row * rowBytes));
    unsigned char* nextChannel = rowStart;
    for (col = 0; col < width; col++)
    {
        unsigned char red, green, blue, alpha;

        red = *nextChannel;
        nextChannel++;
        green = *nextChannel;
        nextChannel++;
        // ...etc...
    }
}
于 2013-10-29T04:22:25.303 回答