NSBitmapImageRep到RGB具有高效率

时间:2011-10-19 21:34:50

标签: macos cocoa qtkit nsbitmapimagerep

我正在开发我的第一个mac osx cocoa app 10.5+,我有一个CVImageBufferRef(使用QTKit捕获),我需要通过TCP Socket将此图像传输到客户端应用程序。客户端应用程序需要RGB值。所以这就是我目前正在做的事情(我目前的解决方案可以根据需要运行但使用大量的CPU)

CVImageBufferRef - > NSBitmapImageRep - > NSData - >然后通过TCP Socket将NSData传输到客户端应用程序,在客户端,我有以下代码来获取RGB:

UInt8 r,g,b
int width=320;
int height=240;

NSData *data; //read from TCP Socket
NSBitmapImageRep *bitmap=[[NSBitmapImageRep alloc] initWithData:data];

for (y=1;y<=height;y++) {
    for(x=1;x<=width;x++){


        NSColor *color=[bitmap colorAtX:x y:y];
        // ^^ this line is actually a culprit and uses a lot of CPU


        r=[color redComponent]*100;
        g=[color greenComponent]*100;
        b=[color blueComponent]*100;
        NSLog(@"r:%d g:%d b:%d",r,g,b);
    }
}

[bitmap release];

如果CVImageBufferRef可以转换为完美的RGB值数组,否则我需要一个有效的解决方案来将NSBitmapImageRep转换为RGB值。

2 个答案:

答案 0 :(得分:3)

您可以使用bitmapData获取位图数据,并从中获取所需的像素值。这应该会使许多案例的速度提高100倍以上。

(日志也应该这样)

答案 1 :(得分:3)

如果从CVImageBufferRef直接进入,可以使用CVPixelBuffer,因为它是从CVImageBuffer派生的。使用CVPixelBufferLockBaseAddress()然后使用CVPixelBufferGetBaseAddress()获取指向第一个像素的指针。还有许多其他CVPixelBufferGet *方法(http://developer.apple.com/library/mac/#documentation/QuartzCore/Reference/CVPixelBufferRef/Reference/reference.html)来查询宽度,高度等,以了解要传输的数据的大小。当然,CVPixelBufferUnlockBaseAddress()一旦完成了数据。

如果使用NSBitmapImageRep,我同意贾斯汀的观点。使用[bitmap bitmapData]将返回指向第一个元素的指针。即使没有先验知识,您也可以发送原始数据:

unsigned char *data = [bitmap bitmapData];
unsigned long size = [bitmap pixelsWide]*[bitmap pixelsHigh]*[bitmap samplesPerPixel]*sizeof(unsigned char);

此数据将是RGB连续值,即1stRedComponent = *(data + 0)1stGreenComponent = *(data + 1) 1stBlueComponent = *(data + 2)将为您提供数据中的第一个RGB组件,如果您需要NSBitmapImageRep之外的像素特定访问