从PNG图像的非透明像素创建区域

时间:2014-02-28 10:29:03

标签: java android

我需要从PNG图像中提取像素完美区域以检测碰撞。我发现以下代码是一个解决方案:

public static Region create(Image image) {

    Region region = new Region();

    for (int i = 0; i < image.getWidth(); i++) {
        for (int j = 0; j < image.getHeight(); j++) {
            if (Color.alpha(image.getRGB(i, j)) == 255) {
                region.op(new Rect(i, j, 1, 1), Region.Op.UNION);
            }
        }
    }

    return region;

    }

以下是Image类的实现:

public class AndroidImage implements Image {

    Bitmap bitmap;
    ImageFormat format;

    public AndroidImage(Bitmap bitmap, ImageFormat format) {
        this.bitmap = bitmap;
        this.format = format;
    }

    @Override
    public int getWidth() {
        return bitmap.getWidth();
    }

    @Override
    public int getHeight() {
        return bitmap.getHeight();
    }

    @Override
    public int getRGB(int x, int y) {
        return bitmap.getPixel(x, y);
    }

    @Override
    public ImageFormat getFormat() {
        return format;
    }

    @Override
    public void dispose() {
        bitmap.recycle();
    }

}

碰撞检测不起作用,当我从返回的区域调用方法.isEmpty()时,它返回true。知道为什么吗?

1 个答案:

答案 0 :(得分:0)

您可以在AndroidImage类中创建一个函数,

public Region getTranspRegion()
{
    BitmapDrawable bitmapChecker = new BitmapDrawable(bitmap);
    Region transpRegion = bitmapChecker.getTransparentRegion();
    return transpRegion;
}

然后在你的主要课程中:

Region imageRegion = new Region(imageX, imageY, image.getWidth(), image.getHeight());
Region collisionRegion = new Region(imageRegion);
collisionRegion.op(image.getTranspRegion(), Op.DIFFERENCE);

比检查每个像素要容易得多。我认为你的问题可能是因为你正在调用getRGB,这似乎不会给你带来Alpha值。

我不知道如何处理两个区域的实际检测部分,但是......