1

OpenGLを使用せずにUIImageのRGBA値を変更するために、ピクセルで反復を実行しようとしています。以下のコードを使用して反復パフォーマンスをテストしてみましたが、非常に不満でした。1秒あたり数千回の反復しか得られなかったようです。そして、数十万ピクセルのUIImageの場合、これは長すぎます...パフォーマンスを向上させる方法や、このような操作に通常かかる時間について、誰か提案がありますか?

-(UIImage*)modifyPixels:(UIImage*)originalImage
{
    NSData* pixelData = (NSData*)CGDataProviderCopyData(CGImageGetDataProvider(originalImage.CGImage));
    void* pixelBytes = [pixelData bytes];

    // Take away the red pixel, assuming 32-bit RGBA
    for(int i = 0; i < [pixelData length]; i += 4) {
        NSLog(@" %ith iteration (%i / %i / %i / %i)", i, pixelData[i], pixelData[i+1], pixelData[i+2], pixelData[i+3]);
    }

    //NSData* newPixelData = [NSData dataWithBytes:pixelBytes length:[pixelData length]];
    //UIImage* newImage = [UIImage imageWithData:newPixelData]; 

    return originalImage;    
}
4

3 に答える 3

5

[pixelData length]ループ内で呼び出さないでください。コンパイラは、このメッセージの結果が定数であることを認識できないため、代わりにメソッドを呼び出します。

于 2009-08-30T02:43:57.323 に答える
4

NSLog ステートメントは、イメージの反復プロセスを大幅に遅くします。良いテストは、ピクセル データをログアウトする代わりに画像を反転することです。また、各反復のデータ長を計算すると、処理が遅くなります。長さをローカル変数にキャッシュし、代わりにそれを使用します。

于 2009-08-30T02:36:32.407 に答える
0

コードの基本的な問題は、ピクセルを 4 バイト要素として扱っていることです。最初のステップとして行う必要があるのは、4 バイトのブロックを 1 ワードとして読み取ることです。uint32_t 型を使用して、一度に 1 ワードずつレジスタに読み込みます。これにより、メモリ読み取り操作が 4 分の 1 になり、各ピクセルは 1 つの 32 ビット レジスタに格納されます。各ワードには RGBA が含まれ、各コンポーネントは 32 ビット ワードの 8 ビットを占めます。次に、ビット シフト操作を使用してコンポーネントを操作する必要があります。これは、iOS ネイティブの BGRA 形式のピクセルpixel_binary_layoutを使用してそれを行う方法を示すブログ投稿です。. ピクセル ロジックが何を行うにしても、結果を書き出してから、それらの結果をチェックして、すべてが期待どおりに機能していることを確認する必要があります。ARM チップ上でワード全体を読み書きすることは、4 倍のバイト数を読み取るよりもはるかに高速であるため、大幅な改善が見られるはずです。

于 2013-08-22T07:50:32.750 に答える