在安卓中获取位图的所有像素

4

我想获取位图的像素列表。

我已经成功在屏幕上显示了位图,但是每次尝试获取像素列表时,数组总是为0。

我不确定为什么会这样。 我已经搜索并尝试了几天不同的答案。 数组的长度存在且不为null。因此,我不确定为什么它不起作用。

  @Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    line = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.line);
    sun = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.circle);

    line = Bitmap.createBitmap(line, 0, 0, line.getWidth(), line.getHeight());



    canvas.drawBitmap(line, 0, 0, null);
    canvas.drawBitmap(sun, 0,0, null);


    Log.d("BITMAP","WIDTH:"+line.getWidth()+" HEIGHT:"+line.getHeight());


    pixelAmount = new int[line.getHeight()*line.getRowBytes()];

    line.getPixels(pixelAmount,0,line.getWidth(),0,0,line.getWidth()-1,line.getHeight()-1);

    Log.d("Line", "Pixel: " + pixelAmount.length + " Index" + 0);
    Log.d("Line", "Pixel: " + pixelAmount[10] + " Index" + 0);
    Log.d("Line", "Pixel: " + pixelAmount[100] + " Index" + 0);
    Log.d("Line", "Pixel: " + pixelAmount[56] + " Index" + 0);
    Log.d("Line", "Pixel: " + pixelAmount[76] + " Index" + 0);


    }
}
1个回答

3
我猜这是因为你使用的方法不正确。通过执行以下操作:
line = Bitmap.createBitmap(line.getWidth(), line.getHeight(), Bitmap.Config.ARGB_8888);

您只需创建一个新的、空的位图。但是您必须提供一个源位图,就像这个方法:

line = createBitmap(line, 0, 0, line.getWidth(), line.getHeight());

此外,您应确保使用decodeFromResource()方法创建位图。只需添加一个检查宽度和高度的日志,如下所示:
Log.d("BITMAP","WIDTH:"+line.getWidth()+" HEIGHT:"+line.getHeight);

如果有宽度和高度,那么您就知道创建成功了。

编辑

下一个问题在这里:

pixelAmount = new int[line.getHeight()*line.getRowBytes()];

必须是:

pixelAmount = new int[line.getHeight()*line.getWidth()];

然后像这样检查:

for(int i=0;i<pixelAmount.length;i++){

int pixel = pixelAmount[i];
if(pixel!=0){
Log.d("BITMAP","PIXELS:"+pixel[i]);
}

}

如果输出的数据过大,Android Monitor 中的输出可能会过多,早期输出的数据可能会被删除。


谢谢!有宽度和高度,但由于某些原因数组仍然为空。 - Edon Freiner
你没有使用我在答案中写的方法。你仍然在使用旧方法。 - Opiatefuchs
我也把 createBitmap 去掉了,它仍然会在屏幕上显示,但是不起作用。我之前尝试过所有这些方法,似乎都不能让我得到图像的像素位置。 - Edon Freiner
你的意思是,我删掉了这一行代码 line = Bitmap.createBitmap(line.getWidth(), line.getHeight(), Bitmap.Config.ARGB_8888); 并用 line = createBitmap(line, 0, 0, line.getWidth(), line.getHeight()); 替换它? - Edon Freiner
我认为你有一个误解。你的图片是.png文件吗?如果是,那么它们之间存在透明度,这个透明度为0。使用for循环并检查每个像素,你会发现里面有东西。 - Opiatefuchs
显示剩余14条评论

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