我已经编写了以下函数来更改位图的伽玛值,但它很慢,即使是小的(300乘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)的功率,这有帮助,但这还不够。另外,声明第二个for循环之外的所有int都没有多大帮助,所以我把它们留了下来。提前谢谢。
答案 0 :(得分:1)
如果你真的希望它快速的话,我会考虑使用OpenGL或RenderScript。两者都在Android上有很好的集成。