2012-02-20 47 views
1

如果我用我的三星galaxy s2拍照,照片是3264 x 2448 px。 我想對其使用顏色範圍檢查,但它不起作用。但是,如果我將圖片縮小爲例如2500 x 2500(如此少的像素),那麼它確實有效。但我想要使用星系s2(3264 x 2448)的圖片大小。 我認爲這是一個記憶問題? 我不完全知道限制是什麼。 但是他們的另一種方式來「繞過」這個問題?位圖大到使用getPixels?

這是一段代碼,我該怎麼辦,現在:

bmp = BitmapFactory.decodeResource(getResources(), 
       R.drawable.four_colors); 

int width = bmp.getWidth(); 
int height = bmp.getHeight(); 
int[] pixels = new int[width * height]; 

bmp.getPixels(pixels, 0, width, 0, 0, width, height); 

for (int y = 0; y < height; y++){ 
      for (int x = 0; x < width; x++){ 
        int index = y * width + x; 
        int R = (pixels[index] >> 16) & 0xff;  //bitwise shifting 
        int G = (pixels[index] >> 8) & 0xff; 
        int B = pixels[index] & 0xff; 
        total++; 
        if ((G > R)&&(G > B)){ 
         counter++; 
        } 
      } 
} 

它崩潰,因爲畫面是大,小圖片的工作。 那麼他們有什麼可以「繞過」這個問題呢?而不是使用更小的圖像:)

我嘗試了一些其他的東西,沒有成功,我嘗試解釋我試過的東西。

  1. 我試圖「剪切」兩個圖像,然後單獨掃描(沒有工作)。

  2. 我試圖只掃描它的一半(1632 x 1224),然後旋轉圖像(180度)並再次掃描,但也沒有解決。

  3. 打我:)
+0

它在哪裏崩潰? – ethan 2012-02-20 14:51:10

+0

嘿,我明天要試試答案。 我會讓你聽到它出來的是什麼 – Bigflow 2012-02-20 15:31:08

回答

5

當巨大圖像玩弄你真的應該使用BitmapRegionDecoder處理它的塊。

編輯 - 現在有一個簡單的例子:

try { 
     // Processes file in res/raw/huge.jpg or png 
     BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(getResources().openRawResource(R.raw.huge), false); 
     try { 
      final int width = decoder.getWidth(); 
      final int height = decoder.getHeight(); 
      // Divide the bitmap into 1024x768 sized chunks and process it. 
      int wSteps = (int) Math.ceil(width/1024.0); 
      int hSteps = (int) Math.ceil(height/768.0); 
      Rect rect = new Rect(); 
      long total = 0L, counter = 0L; 
      for (int h = 0; h < hSteps; h++) { 
       for (int w = 0; w < wSteps; w++) { 
        int w2 = Math.min(width, (w + 1) * 1024); 
        int h2 = Math.min(height, (h + 1) * 768); 
        rect.set(w * 1024, h * 768, w2, h2); 
        Bitmap bitmap = decoder.decodeRegion(rect, null); 
        try { 
         int bWidth = bitmap.getWidth(); 
         int bHeight = bitmap.getHeight(); 
         int[] pixels = new int[bWidth * bHeight]; 
         bitmap.getPixels(pixels, 0, bWidth, 0, 0, bWidth, bHeight); 
         for (int y = 0; y < bHeight; y++){ 
          for (int x = 0; x < bWidth; x++){ 
           int index = y * bWidth + x; 
           int R = (pixels[index] >> 16) & 0xff;  //bitwise shifting 
           int G = (pixels[index] >> 8) & 0xff; 
           int B = pixels[index] & 0xff; 
           total++; 
           if ((G > R)&&(G > B)){ 
            counter++; 
           } 
          } 
         } 
        } finally { 
         bitmap.recycle(); 
        } 
       } 
      } 
     } finally { 
      decoder.recycle(); 
     } 
+0

嘿,不知何故,我沒有得到BitmapRegionDecoder的工作。 如何使用它? – Bigflow 2012-02-21 08:08:19

+0

雖然文檔很簡單嗎?儘管你通常必須在res/raw或資產上放置大量資源。 – Jens 2012-02-21 08:36:07

+0

上週剛剛開始使用Java。所以這對我來說都是新的。 我修改了你發佈的代碼,所以它在我自己的代碼中工作。 在我繼續之前,我首先要學習/理解您發佈的代碼。 感謝您的幫助! – Bigflow 2012-02-21 09:02:15

1

可以限制你使用一些通過getPixels方法的參數加載一次圖像的像素數據的量。我做了一些非常相似的事情,例如,我一次只讀一行。

for(int y = 0; y < height; y++) 
    { 
     bitmap.getPixels(pixels, 0, width, 0, y, width, 1);