2014-02-28 84 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值。

我不知道如何處理與兩個區域的實際檢測部分,雖然...