То, что я пытаюсь сделать, заключается в том, чтобы сделать снимок с использованием намерения камеры, получить и преобразовать указанную фотографию в массив массивов в градациях серого (примечание: я не заинтересованы в получении изображения в градациях серого, просто нужны байтовые данные). Затем, наконец, примените пороговое значение и усредните все пиксели выше порога.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).
Я убежден, что я столкнулся где-то в растровой части кода (и да, я прочитал руководство для разработчиков и несколько потоков здесь и в других местах). Что происходит с растровой частью?
Это поможет, если вы выведете логарифм вывода из аварии. –
ошибка не появляется в logcat (это зависает и останавливается без ошибок), отладчик указывает, что это исключение RuntimeException - я бы разместил logcat, если бы у него была эта информация. –
Вы пытались установить точку останова прямо перед тем, как считаете, что произошел сбой, и оценивая условия ваших переменных? Затем, переступив и убедившись, что он рушится там, где вы думаете? – HalR