0

ビットマップのガンマを変更するために次の関数を作成しましたが、小さい(300 x 300)ビットマップでも少し遅くなります。この関数をより速く実行するにはどうすればよいですか?たとえば、ビットマップから個々のピクセル値にアクセスするためのより良い方法(つまり、より高速な方法)はありますか?

public Bitmap apply(Bitmap bmp, float gamma) {
    if (bmp == null)
        return null;

    int width = bmp.getWidth();
    int height = bmp.getHeight();

    int[] pixels = new int[width * height];
    bmp.getPixels(pixels, 0, width, 0, 0, width, height);

    int[] powers = new int[256];
    for (int i = 0; i < powers.length; i++)
        powers[i] = (int)(Math.pow(i / 255.0f, 1.0f / gamma) * 255);

    for (int p = 0; p < pixels.length; p++) {
        int r = Color.red(pixels[p]);
        int g = Color.green(pixels[p]);
        int b = Color.blue(pixels[p]);
        int newR = powers[r];
        int newG = powers[g];
        int newB = powers[b];
        pixels[p] = Color.rgb(newR, newG, newB);
    }

    Bitmap newBmp = Bitmap.createBitmap(pixels, 0, width, width, height, Config.ARGB_8888);
    return newBmp;
}

最適化として、可能なすべてのピクセル値(0〜255)で事前に検出力を計算します。これは役立ちますが、十分ではありません。また、2番目のforループの外側にあるすべてのintを宣言してもあまり役に立たなかったので、そのままにしておきました。よろしくお願いします。

4

1 に答える 1

1

本当に高速にしたい場合は、OpenGLまたはRenderScriptを使用することを検討します。どちらも Android でうまく統合されています。

于 2012-05-15T05:25:31.070 に答える