2013-06-28 2 views
0

То, что я пытаюсь сделать, заключается в том, чтобы сделать снимок с использованием намерения камеры, получить и преобразовать указанную фотографию в массив массивов в градациях серого (примечание: я не заинтересованы в получении изображения в градациях серого, просто нужны байтовые данные). Затем, наконец, примените пороговое значение и усредните все пиксели выше порога.bitmap crashing при попытке конвертировать изображение с камерой в оттенки серого массива

Соответствующий фрагмент кода:

@Override 
     public void onClick(View v) { 



      Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);    
      startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 


      } 

    }); 

} 



@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    InputStream stream = null; 
     if(requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) { 
      try { 
       stream = getContentResolver().openInputStream(data.getData()); 
       bmp = BitmapFactory.decodeStream(stream); 

       bmp.getPixels(pixels, 0, bmp.getWidth(), 0, 0, bmp.getWidth(), bmp.getHeight()); 
       for(int x = 0; x < bmp.getWidth(); ++x) { 
        for(int y = 0; y < bmp.getHeight(); ++y) { 
         int index = y * bmp.getWidth() + x; 
         int R = (pixels[index] >> 16) & 0xff; 
         int G = (pixels[index] >> 8) & 0xff; 
         int B = (pixels[index]) & 0xff; 

         double Grey = (0.299 * R + 0.587 * G + 0.114 * B); 

         if(Grey > 20) { 
          sum += Grey; 
          count++; 
         } 
        } 
       } 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } finally { 
       if (stream != null) 
        try { 
         stream.close(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 

       //Toast.makeText(this, "Image saved to:\n" + data.getData(), Toast.LENGTH_LONG).show(); 


          double Y = sum/count; 

Тост комментарий есть для тестирования, я использовал это раньше, чтобы убедиться, что цель работал - это было, но путь он дал был

Содержание: // СМИ/внешние/изображения/СМИ/##

(где ## это следующий номер фото).

Я пробовал это в эмуляторе Eclipse, и получаю ошибку RuntimeException, где начинается растровое изображение. Я получаю подобный сбой, когда я делаю живой тест на LG Optimus L3 (версия Android 2.3.6).

Я убежден, что я столкнулся где-то в растровой части кода (и да, я прочитал руководство для разработчиков и несколько потоков здесь и в других местах). Что происходит с растровой частью?

+0

Это поможет, если вы выведете логарифм вывода из аварии. –

+0

ошибка не появляется в logcat (это зависает и останавливается без ошибок), отладчик указывает, что это исключение RuntimeException - я бы разместил logcat, если бы у него была эта информация. –

+1

Вы пытались установить точку останова прямо перед тем, как считаете, что произошел сбой, и оценивая условия ваших переменных? Затем, переступив и убедившись, что он рушится там, где вы думаете? – HalR

ответ

1

После нескольких исследований по некоторым вопросам здесь (и я поддержал те, которые были особенно полезны), а также в различных местах кодирования и совсем немного ночного самообразования-образования, теперь я работаю , Ниже приведен фрагмент рабочего кода:

@Override 
     public void onClick(View v) { 



      Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
      //intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);     
      startActivityForResult(Intent.createChooser(intent, "Select Picture"), CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 

      } 

    }); 

} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    //super.onActivityResult(requestCode, resultCode, data); 
     if(requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) { 
      final ContentResolver cr = getContentResolver(); 
        final String[] p1 = new String[] { 
          MediaStore.Images.ImageColumns._ID, 
          MediaStore.Images.ImageColumns.DATE_TAKEN 
        }; 
        Cursor c1 = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, p1, null, null, p1[1] + " DESC"); 
        if (c1.moveToFirst()) { 
         String uristringpic = "content://media/external/images/media/" +c1.getInt(0); 
         Uri uri = Uri.parse(uristringpic); 
         try { 
          Bitmap bm = android.provider.MediaStore.Images.Media.getBitmap(cr, uri); 
          int w = bm.getWidth(); 
          int h = bm.getHeight(); 

          Bitmap bmg = Bitmap.createBitmap(w, h, bm.getConfig()); 

          for(int x = 0; x < w; ++x) { 
           for(int y = 0; y < h; ++y) { 
            int pixel = bm.getPixel(x, y); 
            a = Color.alpha(pixel); 
            r = Color.red(pixel); 
            g = Color.green(pixel); 
            b = Color.blue(pixel); 
            r = g = b = (int)(0.299 * r + 0.587 * g + 0.114 * b); 

            bmg.setPixel(x, y, Color.argb(a, r, g, b)); 
            grey = 0.299 * r + 0.587 * g + 0.114 * b; 
            if(grey > 20) { 
             sum += grey; 
             count++; 

            } 
            //int grey = (r + g + b)/3; 
           } 
          } 


          ImageView imageView = (ImageView) findViewById(R.id.ImageView); 
          imageView.setImageBitmap(bmg); 
          //Toast.makeText(MainActivity.this, String.valueOf(Y), Toast.LENGTH_LONG).show(); 
          //Toast.makeText(this, uri.toString(),Toast.LENGTH_LONG).show(); 


         } catch (FileNotFoundException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
          Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT).show(); 
         } catch (IOException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
          Toast.makeText(this, "Failed to load", Toast.LENGTH_SHORT).show(); 
         } 
         //Toast.makeText(this, "newuri " + uri, Toast.LENGTH_LONG).show(); 
        } c1.close(); 





       //Toast.makeText(this, "Image saved to:\n" + data.getData(), Toast.LENGTH_LONG).show(); 


          double Y = sum/count;