Android 尝试将相机意图图像转换为灰度字节数组时位图崩溃
我想做的是,使用相机拍摄一张照片,检索并将照片转换为灰度字节数组(注意:我对获取灰度图像不感兴趣,只需要字节数据)。最后,应用一个阈值并平均阈值以上的所有像素 相关的代码片段是:Android 尝试将相机意图图像转换为灰度字节数组时位图崩溃,android,bitmap,grayscale,android-camera-intent,Android,Bitmap,Grayscale,Android Camera Intent,我想做的是,使用相机拍摄一张照片,检索并将照片转换为灰度字节数组(注意:我对获取灰度图像不感兴趣,只需要字节数据)。最后,应用一个阈值并平均阈值以上的所有像素 相关的代码片段是: @Override public void onClick(View v) { Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); intent.
@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;
@覆盖
公共void onClick(视图v){
Intent Intent=新Intent(android.provider.MediaStore.ACTION\u IMAGE\u CAPTURE);
intent.putExtra(MediaStore.EXTRA_输出,fileUri);
startActivityForResult(意图、捕获、图像、活动、请求、代码);
}
});
}
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
InputStream=null;
if(requestCode==捕获\图像\活动\请求\代码和结果代码==结果\确定){
试一试{
stream=getContentResolver().openInputStream(data.getData());
bmp=位图工厂.decodeStream(流);
bmp.getPixels(像素,0,bmp.getWidth(),0,0,bmp.getWidth(),bmp.getHeight());
对于(int x=0;x>16)&0xff;
int G=(像素[索引]>>8)&0xff;
intb=(像素[索引])&0xff;
双灰=(0.299*R+0.587*G+0.114*B);
如果(灰色>20){
总和+=灰色;
计数++;
}
}
}
}catch(filenotfounde异常){
e、 printStackTrace();
}最后{
if(流!=null)
试一试{
stream.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
//Toast.makeText(此“图像保存到:\n”+data.getData(),Toast.LENGTH\u LONG.show();
双Y=总和/计数;
toast评论是用于测试的,我早些时候用它来确保意图是有效的——是的,但它给出的路径是有效的
Content://media/external/images/media/##
(其中##是下一张照片的编号)
我曾在Eclipse emulator中尝试过这一点,但在位图开始处出现运行时异常错误。在LG Optimus L3(Android版本2.3.6)上进行实时测试时,我也遇到类似的崩溃
我确信我在代码的位图部分的某个地方搞错了(是的,我在这里和其他地方读过《开发人员指南》和一些线程)。位图部分出了什么问题?在这里对一些问题进行了一些研究之后(我对特别有用的问题进行了投票),在不同的编码场所和相当多的深夜自我编码教育中,我现在已经开始使用它了。下面是正在使用的代码片段:
@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;
@覆盖
公共void onClick(视图v){
Intent Intent=新Intent(android.provider.MediaStore.ACTION\u IMAGE\u CAPTURE);
//intent.putExtra(MediaStore.EXTRA_输出,fileUri);
startActivityForResult(Intent.createChooser(Intent,“选择图片”)、捕获\图像\活动\请求\代码);
}
});
}
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
//super.onActivityResult(请求代码、结果代码、数据);
if(requestCode==捕获\图像\活动\请求\代码和结果代码==结果\确定){
最终ContentResolver cr=getContentResolver();
最终字符串[]p1=新字符串[]{
MediaStore.Images.ImageColumns.\u ID,
MediaStore.Images.ImageColumns.DATE\u拍摄
};
游标c1=cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,p1,null,null,p1[1]+“DESC”);
if(c1.moveToFirst()){
字符串uristringpic=”content://media/external/images/media/“+c1.getInt(0);
Uri=Uri.parse(uristringpic);
试一试{
位图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());
对于(int x=0;x20){
总和+=灰色;
计数++;
}
//内部灰色=(r+g+b)/3;
}
}
ImageView ImageView=(ImageView)findViewById(R.id.ImageView);
设置图像位图(bmg);