YXTS122 2021-02-16 15:09 采纳率: 100%
浏览 72
已采纳

拍照显示图片时出现个空指针,没头绪

public class MainActivity extends Activity {
    public static final int TAKE_PHOTO=1;
    private ImageView picture;
    private Uri ImageUri;
    private Button takePhoto;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        picture=(ImageView) findViewById(R.id.picture);
        takePhoto= (Button) findViewById(R.id.take_photo);
        takePhoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //创建File对象,用于存储拍照后的图片
                File outputImage=new File(getExternalCacheDir(),"outputImage.jpg");
                try {
                if (outputImage.exists()){
                    outputImage.delete();
                }
                    outputImage.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if (Build.VERSION.SDK_INT>=24){
                    ImageUri= FileProvider.getUriForFile(MainActivity.this,
                            "com.example.camerralbumtest.fileprovider",outputImage);
                }else {
                    ImageUri=Uri.fromFile(outputImage);
                }
                //启动相机程序
                Intent intent=new Intent("android.media.action.IMAGE_CAPTURE");
                intent.putExtra(MediaStore.EXTRA_OUTPUT,ImageUri);
                startActivityForResult(intent,TAKE_PHOTO);
            }
        });
    }
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode){
            case TAKE_PHOTO:
                if (resultCode==RESULT_OK){
                    try { 
                        //将拍摄的照片显示出来
                        Bitmap bitmap= BitmapFactory.decodeStream(getContentResolver().openInputStream(ImageUri));
                        
                        try{
                        ArrayList<Integer> picturePixel=BitmapUtil.getPicturePixel(bitmap);
                        HashMap<Integer,Integer> color2=new HashMap<Integer, Integer>();
                        for (Integer color:picturePixel){
                            if (color2.containsKey(color)){
                                Integer integer = color2.get(color);
                                integer++;
                                System.out.println(integer++);
                                color2.remove(color);
                                color2.put(color,integer);

                            }else{
                                color2.put(color,1);
                            }
                        }
                        
                        //挑选数量最多的颜色
                        Iterator iter = color2.entrySet().iterator();
                        
                        int count=0;
                        int color=0;
                        while (iter.hasNext()) {
                            Map.Entry entry = (Map.Entry) iter.next();
                            int value = (Integer) entry.getValue();
                            if (count<value){
                                count=value;
                                color= (Integer) entry.getKey();
                            }

                        }
                        
                        bitmap.eraseColor(color);
                        picture.setImageBitmap(bitmap);
                        }
                        catch (Exception e) {
                          
                            Toast.makeText(getApplication(), e.toString(), Toast.LENGTH_LONG).show();
                        }
                        System.gc(); 
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                        Toast.makeText(getApplication(), e.toString(), Toast.LENGTH_LONG).show();
                    }
                }
                break;
            default:
                break;
        }
    }
    
    static class BitmapUtil{
    public static ArrayList<Integer> getPicturePixel(Bitmap bitmap)
    {
    	int width = bitmap.getWidth();
        int height = bitmap.getHeight();

        // 保存所有的像素的数组,图片宽×高
        int[] pixels = new int[width * height];

        bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
        ArrayList<Integer> rgb=new ArrayList<Integer>();
        for (int i = 0; i < pixels.length; i++) {
            int clr = pixels[i];
            int red = (clr & 0x00ff0000) >> 16; // 取高两位
            int green = (clr & 0x0000ff00) >> 8; // 取中两位
            int blue = clr & 0x000000ff; // 取低两位
            Log.d("tag", "r=" + red + ",g=" + green + ",b=" + blue);
            int color = Color.rgb(red, green, blue);	                            //除去白色和黑色
            if (color!=Color.WHITE && color!=Color.BLACK){
                rgb.add(color);
            }
        }
        return rgb;
    }
    }
}

 

 

  • 写回答

1条回答 默认 最新

  • huang_ftpjh 2021-02-19 11:17
    关注

    outputImage是否真的存在

     

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

    ImageUri 上面不存在导致这个对象也不行了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 输出区间内所有的完数的个数。 要简单点的程序
  • ¥15 asp.core 权限控制怎么做,需要控制到每个方法
  • ¥20 while循环中OLED显示中断中的数据不正确
  • ¥15 这个视频里的stm32f4代码是怎么写的
  • ¥15 JNA调用DLL报堆栈溢出错误(0xC00000FD)
  • ¥15 请教SGeMs软件的使用
  • ¥15 自己用vb.net编写了一个dll文件,如何只给授权的用户使用这个dll文件进行打包编译,未授权用户不能进行打包编译操作?
  • ¥50 深度学习运行代码直接中断
  • ¥20 需要完整的共散射点成像代码
  • ¥15 编写vba代码实现数据录入工作