私がやろうとしているのは、カメラの意図を使用して写真を撮り、その写真を取得してグレースケールのバイト配列に変換することです(注:グレースケールの画像を取得することに興味はなく、バイトデータが必要なだけです)。最後に、しきい値を適用し、しきい値を超えるすべてのピクセルを平均化します。
関連するコード スニペットは次のとおりです。
@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;
トースト コメントはテスト用です。インテントが機能していることを確認するために以前にそれを使用しました。機能していましたが、パスは
コンテンツ://media/external/images/media/##
(## は次の写真番号です)。
Eclipse エミュレーターでこれを試しましたが、ビットマップの開始位置で RuntimeException エラーが発生します。LG Optimus L3 (Android バージョン 2.3.6) でライブ テストを実行すると、同様のクラッシュが発生します。
私は、コードのビットマップ部分のどこかでおかしくなったと確信しています (そして、はい、開発者ガイドとここや他の場所のいくつかのスレッドを読みました)。ビットマップ部分で何が問題になっていますか?