2011-10-19 56 views
2

我正在为我的第一个Mac OS X可可应用程序工作10.5+,我有一个CVImageBufferRef(使用QTKit捕获),我需要通过TCP Socket将此图像传输到客户端应用程序。客户端应用程序需要RGB值。所以这里是我目前正在做的(我目前的解决方案按需要工作,但使用了很多CPU)NSBitmapImageRep为高效率的RGB

CVImageBufferRef - > NSBitmapImageRep - > NSData - >然后通过TCP套接字传输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值。

+0

您的示例代码有问题。你不使用“位图”,什么是“self.imageData”? – JWWalker

+0

对不起,更正了代码,实际上在我的真实代码中,另一个线程将图像存储在ivar中,第二个线程访问imageData,使用NSLock维护线程安全。 –

回答

3

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

如果使用NSBitmapImageRep,我同意Justin。使用[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之外的特定访问

+0

现在完美的工作,CPU使用率从85%下降到只有10%:) 其实我试过[bitmap bitmapData],但它昨天没有工作,但在阅读你的优秀详细回答它只是工作...谢谢,并保持它;-) –

+0

感谢您的意见,并很高兴它的工作。 – pontidm

3

您只需使用bitmapData即可获得位图数据,并从中获取所需的像素值。这应该使许多情况下快100倍以上。

(日志也该走了)

+1

正确,它的工作,谢谢:) –