我想要做的是使用相机意图拍摄照片,检索所述照片并将其转换为灰度字节数组(注意:我对获取灰度图像不感兴趣,只需要字节数据)。最后,应用一个阈值并对高于阈值的所有像素进行平均。
相关的代码片段是:
@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)上进行实时测试时,我遇到了类似的崩溃。
我确信我在代码的位图部分的某个地方搞砸了(是的,我已经阅读了开发人员指南和这里和其他地方的几个线程)。位图部分出了什么问题?