NSBITMAPIMAGEREPからRGBへの高い効率
-
27-10-2019 - |
質問
私は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から直接進む場合は、CVimageBufferから派生しているため、CVPixelBufferを使用できます。 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)
nsbitmapimagerepの外側にピクセル固有のアクセスが必要な場合、データの最初のRGBコンポーネントを提供します
他のヒント
ビットマップデータを使用して取得できます bitmapData
必要なピクセル値を取得します。これにより、多くのケースが100倍以上速くなるはずです。
(ログも行くはずです)