2

uiimageからデータを取得してRGB値を読み取りたい。このデータを畳み込みフィルターに使用したいと思います。インターネットで私はただ一つの方法を見つけました:

// First get the image into your data buffer
CGImageRef image = [UIImage CGImage];
NSUInteger width = CGImageGetWidth(image);
NSUInteger height = CGImageGetHeight(image);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *rawData_ = malloc(height * width * 4);
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel_ * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent,           bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);

CGContextDrawImage(context, CGRectMake(0, 0, width, height));
CGContextRelease(context);

// Now your rawData contains the image data in the RGBA8888 pixel format.
int byteIndex = (bytesPerRow * yy) + xx * bytesPerPixel;
red = rawData[byteIndex];
green = rawData[byteIndex + 1];
blue = rawData[byteIndex + 2];
alpha = rawData[byteIndex + 3];

大丈夫ですが、[x] [y] [r、b、g]のような配列のピクセルを操作したいと思います。

どうすれば解決できますか?

4

2 に答える 2

1

画像データを取得する別の方法があります:技術的なQ&A QA1509:CGImageオブジェクトからピクセルデータを取得する

アクセス方法については、あまり選択肢がありません。多次元C配列は、2番目以降の次元がコンパイル時に既知の固定サイズである場合にのみ機能します。画像データはありません。

于 2012-05-16T07:14:21.963 に答える
0

別の提案として、CPU で画像の畳み込みを行わないことをお勧めします。代わりに、 GPUImageフレームワーク内にさまざまな GPU ベースの畳み込みがあり、CPU バウンドの実装よりも桁違いに高速です。

これらには、画像の輝度でソーベル エッジ検出を実行する、高度に最適化された GPUImageSobelEdgeDetectionFilter と、汎用の 3x3 畳み込みカーネルを提供して任意の画像に適用できるようにする GPUImage3x3ConvolutionFilter が含まれます。ライブ ビデオの場合、受信フレームをリアルタイムで簡単に処理できます。UIImage の場合、これらのフィルターは、CPU で実行される畳み込みよりも 6 ~ 10 倍速く実行できます。

特定の質問によると、ケンの提案は良いものですが、実際には、リンクされた記事でAppleが提案しているデータコピーのアプローチは、実際にはビットマップコンテキストで画像を再描画するよりも遅くなることがわかりました。これは奇妙に思えますが、私のベンチマークでは一貫した結果が得られています。上に示した Core Graphics の描画は、生の UIImage ピクセル データにアクセスするために私が見つけた最速の方法です。

于 2012-05-16T16:22:19.077 に答える