【发布时间】:2013-06-25 17:39:42
【问题描述】:
我想要做的是使用相机意图拍摄照片,检索所述照片并将其转换为灰度字节数组(注意:我对获取灰度图像不感兴趣,只需要字节数据)。最后,应用一个阈值并对高于阈值的所有像素进行平均。
相关的sn-p代码为:
@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;
toast 评论是用来测试的,我之前用它来确保意图是有效的 - 它是有效的,但它给出的路径是
Content://media/external/images/media/##
(其中## 是下一张照片编号)。
我已在 Eclipse 模拟器中尝试过此操作,但在位图开始处出现 RuntimeException 错误。当我在 LG Optimus L3(Android 版本 2.3.6)上进行实时测试时,我遇到了类似的崩溃。
我确信我在代码的位图部分的某个地方搞砸了(是的,我已经阅读了开发人员指南以及这里和其他地方的几个线程)。位图部分出了什么问题?
【问题讨论】:
-
如果您发布崩溃的 logcat 输出会有所帮助。
-
logcat 中没有出现错误(这会冻结并停止而没有显示错误),调试器指示它是 RuntimeException - 如果它有该信息,我会发布 logcat。跨度>
-
您是否尝试过在您认为崩溃发生之前设置断点并评估变量的条件?然后逐步检查并确保它在您认为的地方崩溃?
-
是的,谢谢你,这将是我的下一步 - 我确定它在位图部分 - 但只是要弄清楚在哪里。
-
如果您没有捕获运行时异常,那么当调试器停止时,只需继续执行,logcat 输出就会显示出来。
标签: android bitmap grayscale android-camera-intent