使用Android的Bitmap类的getPixels()以及如何使用它

Yoo*_*Lee 11 android pixel bitmap

我正在尝试在Android中进行一些图像处理.我需要获取位图的一大块像素信息.所以我尝试使用其中一个Bitmap类方法getPixels().但是,似乎我没有正确使用它,或者我误解了方法行为的唯一目的.

例如,我正在做以下操作,以便从任意位置(位图坐标)x,y获得位图的10乘10区域的像素信息.

Bitmap bitmap = BitmapFactory.decodeFile(filePath);
int[] pixels = new int[100];
bitmap.getPixels(pixels, 0, bitmap.getWidth(), x, y, 10, 10);
Run Code Online (Sandbox Code Playgroud)

而且我得到了ArrayIndexOutOfBoundsException.我一直在谷歌上看看我做错了什么,但我一无所知.关于使用getPixels()的大多数示例或问题通常用于提取整个图像的像素信息的情况.因此int数组的大小通常是bitmap.getWidth()*bitmap.getHeight(),x和y值是0,0,宽度,高度是位图的宽度和高度.

Bitmap的getPixels()是不是为了我的目的而设计的(获取位图子区域的一大块像素信息)?还是我错误地使用它?有没有其他方法可以做到这一点,也许使用不同的类?

如果有人对此有所说,我将不胜感激.谢谢.

小智 7

大多数人想使用 getPixels() 获取特定区域的像素,但实际上它返回了原始位图的完整大小。有效区域位于左角,其他区域为半透明颜色。我建议您使用 Android Studio 调试模式通过创建位图来查看视觉像素。

以下是我获取特定区域像素的 getPixels() 版本:

public class BitmapHelper {

public static int[] getBitmapPixels(Bitmap bitmap, int x, int y, int width, int height) {
    int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()];
    bitmap.getPixels(pixels, 0, bitmap.getWidth(), x, y,
            width, height);
    final int[] subsetPixels = new int[width * height];
    for (int row = 0; row < height; row++) {
        System.arraycopy(pixels, (row * bitmap.getWidth()),
                subsetPixels, row * width, width);
    }
    return subsetPixels;
}
}
Run Code Online (Sandbox Code Playgroud)


小智 6

getPixels()返回源位图的完整int []数组,因此必须使用与源位图的高度x宽度相同的长度进行初始化.

像这样使用,bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, 10, 10);实际上从位图中获取所需的像素,并用0填充数组的其余部分.因此,对于100 x 10的位图的10 x 10子集,从0,0开始,前100个值将是期望的int值,其余为0.

您可以随时尝试使用Bitmap.createBitmap()创建子集位图,然后getPixels()在新的位图上使用以获取完整的数组.

  • 在速度方面,使用 getPixels 比 getPixel 更好吗? (2认同)
  • 我从2017年开始,现在我不确定它是否会返回整个位图.我尝试将像素数组的大小设置为stride*heignt值(传递给getPixels的参数)并且它有效.我通过测试使用不断减少的像素阵列大小的循环来获得此值 (2认同)