【问题标题】:Extracting RGB data from bitmapData (NSBitmapImageRep) Cocoa从 bitmapData (NSBitmapImageRep) Cocoa 中提取 RGB 数据
【发布时间】:2013-10-29 03:22:38
【问题描述】:

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

 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?

谢谢

【问题讨论】:

    标签: objective-c cocoa image-processing


    【解决方案1】:

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

    通常数据是非平面的,这意味着它只是交错的 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...
        }
    }
    

    【讨论】:

    • 非常感谢!!该方法效果很好(进行了一些更改,例如方法的名称 pixelWidth -> pixelWide 等,而且我假设您的意思是外循环中的 row
    • 其实外循环是对的,内循环是错误的。应该是col &lt; width。我会改正的。
    • 太棒了!使用这样的指针非常快。从使用 colorAt 实例循环 20k 像素 x 20k 像素的 500 秒到使用您的代码不到 10 秒。
    • 超级。我打电话给[imageRep bitmapFormat] 来检查我的位图格式,并且必须记住在循环中准确地调用了四次nextChannel++
    猜你喜欢
    • 1970-01-01
    • 2017-05-03
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    相关资源
    最近更新 更多