拍照和从相册选择图片 截图

本文介绍了一个简单的Android应用程序如何实现从图库或相机选取图片,并进行剪裁的过程。具体步骤包括:启动图库或相机获取图片;通过onActivityResult接收返回值;调用剪裁功能;最后展示剪裁后的图片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 private File tempFile;
 private ImageView imgPhoto;
 private static final int PHOTO_REQUEST_GALLERY = 1;
 private static final int PHOTO_REQUEST_CAREMA = 2;
 private static final int PHOTO_REQUEST_CUT = 3;

 private String PHOTO_FILE_NAME="temp.jpg";

第一步,我们可以先激活系统图片或是相机来获取相片
/*
     * 从相册获取
     */
    public void gallery(View view) {
        // 激活系统图库,选择一张图片
        Intent intent = newIntent(Intent.ACTION_PICK);
        intent.setType("image/*");
        // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_GALLERY
        startActivityForResult(intent, PHOTO_REQUEST_GALLERY);
    }
 
    /*
     * 从相机获取
     */
    public void camera(View view) {
        // 激活相机
        Intent intent = newIntent("android.media.action.IMAGE_CAPTURE");
        // 判断存储卡是否可以用,可用进行存储
     //   if(hasSdcard()) {
            tempFile = newFile(Environment.getExternalStorageDirectory(),
                    PHOTO_FILE_NAME);
            // 从文件中创建uri
            Uri uri = Uri.fromFile(tempFile);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
     //   }
        // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CAREMA
        startActivityForResult(intent, PHOTO_REQUEST_CAREMA);
    }







第二步,通过startActivityForResult()方法我们可以在onActivityResult()中来获取到相应的返回值

@Override
    protectedvoidonActivityResult(intrequestCode, intresultCode, Intent data) {
        if(requestCode == PHOTO_REQUEST_GALLERY) {
            // 从相册返回的数据
            if(data != null) {
                // 得到图片的全路径
                Uri uri = data.getData();
                crop(uri);
            }
 
        elseif(requestCode == PHOTO_REQUEST_CAREMA) {
            // 从相机返回的数据
  //          if(hasSdcard()) {
                crop(Uri.fromFile(tempFile));
  //          else{
  //              Toast.makeText(MainActivity.this"未找到存储卡,无法存储照片!"0).show();
  //          }
 
        elseif(requestCode == PHOTO_REQUEST_CUT) {
            // 从剪切图片返回的数据
            if(data != null) {
                Bitmap bitmap = data.getParcelableExtra("data");
                this.iv_image.setImageBitmap(bitmap);
            }
            try{
                // 将临时文件删除
                tempFile.delete();
            catch(Exception e) {
                e.printStackTrace();
            }
 
        }
 
        super.onActivityResult(requestCode, resultCode, data);
    }





第三步,注意到里边有一个crop()方法,顾名思义,就是用于剪切图片的


/*
     * 剪切图片
     */
    private void crop(Uri uri) {
        // 裁剪图片意图
        Intent intent = newIntent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop""true");
        // 裁剪框的比例,1:1
        intent.putExtra("aspectX"1);
        intent.putExtra("aspectY"1);
        // 裁剪后输出图片的尺寸大小
        intent.putExtra("outputX"250);
        intent.putExtra("outputY"250);
 
        intent.putExtra("outputFormat""JPEG");// 图片格式
        intent.putExtra("noFaceDetection"true);// 取消人脸识别
        intent.putExtra("return-data"true);
        // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CUT
        startActivityForResult(intent, PHOTO_REQUEST_CUT);
    }


第四步,在剪切完成图片后,切图应用就会将图片通过onActivityResult()返回给我们

通过Bitmap bitmap = data.getParcelableExtra("data");我们就拿到了我们想要的bitmap



由于上边的代码涉及到读写sdcard,所以要记得在清单文件中授权


<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值