优化Android Bitmap中getpixel()和setpixel()的速度

7

大家好,

在我注意到 getPixelsetPixel 的速度有多慢后(不确定哪一个,猜测两者都没有进行优化),我很快编写了一个使用 int[] 数组来处理位图操作的 Bitmap 容器。

已经可以明显感觉到它更快了,但这还不够。请问如何进一步加速呢?

我的想法是通过 setPixel 函数跟踪被“污染”的部分,并在调用 getBitmap() 时只更新这部分的 Bitmap ... 不过对于如何设置 setPixels 参数还不清楚(我猜大概涉及到偏移和跨度等)。

还有 - 是否有更快的方法呢?

提前感谢所有的帮助!

import android.graphics.Bitmap;

public class DrawableBitmapContainer {
private Bitmap image;
private int width, height;
private int[]  pixels;
public DrawableBitmapContainer(Bitmap _source ){
    image = _source;
    width = image.getWidth();
    height = image.getHeight();
    pixels = new int[width*height];
    image.getPixels(pixels,0,width,0,0,width,height);
}
public int getPixel(int x,int y){
    return pixels[x+y*width];
}
public void setPixel(int x,int y, int color){
    pixels[x+y*width]=color;
}
public Bitmap getBimap(){
    image.setPixels(pixels,0,width,0,0,width,height);
    return image;
}
public int getWidth(){
    return image.getWidth();
}
public int getHeight(){
    return image.getHeight();
}
}

希望你意识到你的位图占用了2倍的内存空间,而且你的setpixel函数不起作用。这个数组只是实际位图中图像矩阵的一个副本。因此,通过更改其中的值,它们不会被持久化,直到你将该缓冲区提交回位图对象。 - Greg Giacovelli
我知道它需要两倍的内存(在我的使用中速度值得),但是我不明白你的评论说setpixel不起作用 - 如果我通过getBitmap方法访问位图,则它可以工作,这正是我想要的。 - Piotr
如果您需要转换较大位图上的每个像素,则可以通过牺牲内存占用来提高性能,这种方法非常有效。 - Kibotu
2个回答

5
对于像 setPixel / getPixel 这样简单的函数,函数调用开销相对较大。
直接访问 pixels 数组比通过这些函数访问要快得多。当然,这意味着您必须将 pixels 设为公共的,从设计角度来看这并不是很好,但如果您绝对需要尽可能提高性能,这是可行的方法。
请参阅 Android 文档中有关性能设计的内容:Designing for performance
如果仍然不够,请考虑使用 NDK 在 C++ 中编写位图操作。

谢谢 - 有没有一种定义“宏”的方法,让我可以使用getPixel(x,y)? - Piotr

0

另一个选择是使用Android NDK。在这方面,你几乎没有什么帮助,但它确实可以提高速度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接