Android和OpenCV载入/保存图片

AndroidManifest.xml的权限声明  

    <!--对SD卡进行写入操作-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!--对SD卡进行读取操作-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

如果图片保存不上就加上这个属性

在<application/>标签添加
android:requestLegacyExternalStorage="true"

载入图片代码

使用按钮btn1添加

 btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //intent可以应用于广播和发起意图,其中属性有:ComponentName,action,data等
                Intent intent = new Intent();
                intent.setType("image/*");
                //action表示intent的类型,可以是查看、删除、发布或其他情况;我们选择ACTION_GET_CONTENT,系统可以根据Type类型来调用系统程序选择Type
                //类型的内容给你选择
                intent.setAction(Intent.ACTION_GET_CONTENT);
                //如果第二个参数大于或等于0,那么当用户操作完成后会返回到本程序的onActivityResult方法
                startActivityForResult(intent, 1);
            }
        });
 //    载入图片
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        //用户操作完成,结果码返回是-1,即RESULT_OK
        if (resultCode == RESULT_OK) {
            //获取选中文件的定位符
            Uri uri = data.getData();
            Log.e("uri", uri.toString());
            //使用content的接口
            ContentResolver cr = this.getContentResolver();
            try {
                //获取图片
                bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));
                img1.setImageBitmap(bitmap);
            } catch (FileNotFoundException e) {
                Log.e("Exception", e.getMessage(), e);
            }
        } else {
            //操作错误或没有选择图片
            Log.i("MainActivtiy", "operation error");
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

保存图片代码

使用按钮btn2添加

        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //REQUEST_GPS为自定义int型静态常量;private final int REQUEST_GPS = 1;
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, 
                Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS}, REQUEST_GPS);
            }
        });
    //动态申请的回调方法
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    //Toast.makeText(MainActivity.this, "Permission GET", Toast.LENGTH_SHORT).show();
    //保存图片的方法,自定义
            saveBitmap();
        } else {
    //Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show();
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

        //保存图片
    public void saveBitmap() {
        //Log.e("开始保存", "保存图片");
        Toast.makeText(MainActivity.this, "开始保存", Toast.LENGTH_SHORT).show();
        //获得SD卡的根路径
        File sd = Environment.getExternalStorageDirectory();
        //获取SD卡是否能够访问
        boolean can_write = sd.canWrite();
        //Log.e("是否被访问", can_write + "");
        //在sd卡路径下创建一个后缀为.jpg的文件
        File f = new File(Environment.getExternalStorageDirectory() + "/虎.jpg");
        //如果文件存在的话,就删除原来的文件。
        if (f.exists()) {
            f.delete();
        }
        try {
            //文件输出流
            FileOutputStream out = new FileOutputStream(f);
            //bm为私有的Bitmap类型的变量。private Bitmap bm;
            //调用bitmap的compress方法
            /*
             *Bitmap.CompressFormat format 图像的压缩格式;
             *int quality 图像压缩率,0-100。 0 压缩100%,100意味着不压缩;
             *OutputStream stream 写入压缩数据的输出流;
            * */
            if (bitmap2 == null) {
                bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
            } else {
                bitmap2.compress(Bitmap.CompressFormat.PNG, 90, out);
            }
            //刷新
            out.flush();
            //关闭输出流
            out.close();
            //Log.e("保存", "已经保存");
            //保存图片后发送广播通知更新数据库
            Uri uri = Uri.fromFile(f);
            sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
            Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

posted @ 2022-05-12 08:56  卟怪  阅读(145)  评论(0编辑  收藏  举报