【问题标题】:bitmap crashing when trying to convert camera-intent image to grayscale byte array尝试将相机意图图像转换为灰度字节数组时位图崩溃
【发布时间】: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


【解决方案1】:

在这里对一些问题进行了一些研究(我赞成那些特别有用的问题),在各种编码场所和相当多的深夜自我编码教育中,我现在可以使用它了。下面是工作代码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.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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 2013-07-29
    相关资源
    最近更新 更多