2014-02-28 87 views
0

我需要从PNG图像中提取像素完美区域以检测碰撞。我发现下面的代码是一个解决办法:从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; 

    } 

以下是图片类的实现:

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。任何想法为什么?

+0

了解如何构建Rect对象 – pskink

回答

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值。

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