我正在为10.5+开发我的第一个mac可可应用程序,其中我有一个CVImageBufferRef (使用QTKit捕获),我需要通过TCP套接字将此图像传输到客户端应用程序。客户端应用程序需要RGB值。下面是我目前正在做的事情(我当前的解决方案按需工作,但使用了大量CPU)
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值。
发布于 2011-10-20 12:00:34
如果直接从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),如果您需要在NSBitmapImageRep之外访问像素特定的数据,1stGreenComponent = *(data + 1) 1stBlueComponent = *(data + 2)将为您提供数据中的第一个RGB分量。
发布于 2011-10-20 05:47:35
您可以使用bitmapData获取位图数据,并从中获取所需的像素值。这将使许多情况下的速度提高100倍以上。
(日志也应该被删除)
https://stackoverflow.com/questions/7828470
复制相似问题