0

画像をピクセルごとに処理するAndroidアプリケーションを作成しています。ピクセルを読み取って設定するには、2つのネストされたループを使用します。

このプロセスには非常に時間がかかります。ループ内の命令を削除しても、8メガピクセルの画像で実行するには約1分かかります。

なんでこんなに時間がかかるの?ピクセルを取得して設定する他の方法はありますか?

    long mn = img_w*img_h;
    long o = 0;
    for(int i =0;i<img_w;i++) {
        for(int j=0;j<img_h;j++) {

                System.out.println(mn-o);

        o++;

        }
    }

このコードは画像処理をシミュレートし、このコードには非常に長い時間がかかります

logcat(セクション):

    02-12 19:01:40.815: I/System.out(332): 4999.0
02-12 19:01:40.815: I/System.out(332): 4998.0
02-12 19:01:40.815: I/System.out(332): 4997.0
02-12 19:01:40.825: I/System.out(332): 4996.0
02-12 19:01:40.825: I/System.out(332): 4995.0
02-12 19:01:40.825: I/System.out(332): 4994.0
02-12 19:01:40.825: I/System.out(332): 4993.0
02-12 19:01:40.825: I/System.out(332): 4992.0
02-12 19:01:40.825: I/System.out(332): 4991.0
02-12 19:01:40.825: I/System.out(332): 4990.0
02-12 19:01:40.835: I/System.out(332): 4989.0
02-12 19:01:40.835: I/System.out(332): 4988.0
02-12 19:01:40.835: I/System.out(332): 4987.0
02-12 19:01:40.835: I/System.out(332): 4986.0
02-12 19:01:40.845: I/System.out(332): 4985.0
02-12 19:01:40.845: I/System.out(332): 4984.0
02-12 19:01:40.845: I/System.out(332): 4983.0
02-12 19:01:40.845: I/System.out(332): 4982.0
02-12 19:01:40.845: I/System.out(332): 4981.0
02-12 19:01:40.845: I/System.out(332): 4980.0
02-12 19:01:40.845: I/System.out(332): 4979.0
02-12 19:01:40.845: I/System.out(332): 4978.0
02-12 19:01:40.855: I/System.out(332): 4977.0
02-12 19:01:40.855: I/System.out(332): 4976.0
02-12 19:01:40.855: I/System.out(332): 4975.0
02-12 19:01:40.855: I/System.out(332): 4974.0
02-12 19:01:40.855: I/System.out(332): 4973.0
02-12 19:01:40.865: I/System.out(332): 4972.0
4

2 に答える 2

1

ループを配置する方法は、キャッシュに非常に不向きです。内側のループが幅を通過し、外側のループが高さを通過するようにします。

于 2013-02-12T18:43:37.840 に答える
0

この方法でJavaの問題を解決できるとは思いません。Javaステートメント(特にメソッド呼び出し)の実行にはオーバーヘッドが伴い、これを800万回実行すると、値の設定など、命令がほとんど何もしない場合でも、常に低速になります。

標準的な答えは、Java仮想マシンによって解釈される代わりにコンパイルされるC ++でこの関数を実装することであり、したがって、より高速であるはずです。それでも、リアルタイムアプリケーションには十分な速度ではないでしょう。あなたはまだ800万回何かをしている、毎回それより少ない。

8 Mbピクセルバッファ全体にわたってJavaでピークアンドポーク操作を実行することは、決して高速ではありません。ただし、Javaの設計者はこの問題を認識していました。そのため、拡張2DグラフィックスAPIを提供して、100万回実行されるループの必要性を排除することがよくあります。ビットマップのビットを設定および読み取るように設計された2DAPIライブラリを詳しく調べることをお勧めします。あなたが本当にやろうとしていることに応じて、はるかに速い方法があるかもしれません。背景が透明なビットマップを設定し、このビットマップに変更を書き込んで、前の画像の上にビットマップを書き込むことができます。ビットマップの上にビットマップを書き込む場合、印象付けられた画像を操作するPaintクラスを設定できます(たとえば、可変の透明度を適用することによって)。Android 2d Graphics APIは、「Porter-Duff」もサポートしています 画像を斬新な方法で組み合わせることができる呼び出しを提供する合成。これらはすべて基本的にハードウェアで実行されるため、非常に高速です。

あなたが何をしようとしているのか(正確に)わからないと、それをより効率的に行う方法を説明することはできませんが、多くの場合、あなたが使用しているブルートフォースアプローチよりもはるかに効率的な実装があります。ない場合、そしてあなたがこのリアルタイムを望むなら、私はあなたが詰め込まれているのではないかと思います。

于 2013-02-13T05:43:09.120 に答える