2012-02-20 1 views
1

私がsamsung galaxy s2で写真を撮ると、写真は3264 x 2448 pxになります。 私はそれに色の範囲のチェックを使用したいが、それは動作しません。getPixelsを使用するには、ビットマップを大きくするには?

しかし、画像をたとえば2500x2500(それほど小さいピクセル)より小さくすると、動作します。しかし、私は、銀河s2(3264 x 2448)の画像サイズを使用します。 私はそれが記憶上の問題だと思いますか? 私は限界が何であるか正確には分かりません。 しかし、この問題を「回避」する別の方法はありますか?

これは、私は今それを行う方法、コードの一部です:

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つにカットして、別々にスキャンしようとしました(機能しませんでした)。

  2. と私はその半分(1632 x 1224)をスキャンしてから画像(180度)を回転して再びスキャンしようとしましたが、これもうまくいかなかった。

  3. は私に:)ヒット
+0

どこがクラッシュしますか? – ethan

+0

ねえ、私は明日の答えを試してみるつもりです。 私はそれから来たものを聞かせてくれます – Bigflow

答えて

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

+0

しかし、ドキュメントはかなり簡単ですか?あなたは通常、res/rawや資産に膨大なリソースを配置する必要があります。 – Jens

+0

先週Javaで始めました。だから私にとっては新しいものだった。 投稿したコードを少し変更したので、自分のコードで動作しました。 私が先に進む前に、あなたが完全に投稿したコードを最初に学び、理解するつもりです。 助けてくれてありがとう! – Bigflow

1

あなたはgetPixelsメソッドのパラメータの一部を使用することにより、一度にロードされている画像の画素データの量を制限することができます。私は非常に似たようなことをしました。たとえば、一度に1行ずつ読んでいました。

for(int y = 0; y < height; y++) 
    { 
     bitmap.getPixels(pixels, 0, width, 0, y, width, 1); 
関連する問題