gpt4 book ai didi

macos - NSBitmapImageRep 高效转 RGB

转载 作者:行者123 更新时间:2023-12-03 16:26:10 26 4
gpt4 key购买 nike

我正在开发我的第一个 10.5+ 版本的 mac osx cocoa 应用程序,其中我有一个 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 值。

最佳答案

如果直接从 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) 如果您需要 NSBitmapImageRep 之外的像素特定访问,将为您提供数据中的第一个 RGB 分量

关于macos - NSBitmapImageRep 高效转 RGB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7828470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com