文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android拍照或从图库选择图片并裁剪

2022-06-06 07:50

关注

今天看《第一行代码》上面关于拍照和从相册选取图片那一部分,发现始终出不来效果,所以搜索其他资料学习一下相关知识,写一个简单的Demo。 

一、 拍照选择图片

1、使用隐式Intent启动相机


//构建隐式Intent
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//调用系统相机
startActivityForResult(intent, 1);

2、处理相机拍照返回的结果


//用户点击了取消
if(data == null){
  return;
}else{
  Bundle extras = data.getExtras();
  if (extras != null){
    //获得拍的照片
    Bitmap bm = extras.getParcelable("data");
  }
}

二、 从图库选择图片

1、构建内容选择隐式Intent

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);

2、设置内容类型为图片

intent.setType("image private Uri saveBitmap(Bitmap bm, String dirPath) { //新建文件夹用于存放裁剪后的图片 File tmpDir = new File(Environment.getExternalStorageDirectory() + "/" + dirPath); if (!tmpDir.exists()){ tmpDir.mkdir(); } //新建文件存储裁剪后的图片 File img = new File(tmpDir.getAbsolutePath() + "/avator.png"); try { //打开文件输出流 FileOutputStream fos = new FileOutputStream(img); //将bitmap压缩后写入输出流(参数依次为图片格式、图片质量和输出流) bm.compress(Bitmap.CompressFormat.PNG, 85, fos); //刷新输出流 fos.flush(); //关闭输出流 fos.close(); //返回File类型的Uri return Uri.fromFile(img); } catch (FileNotFoundException e) { e.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } }

从图库选择的图片返回的是content类型的Uri,我们需要转化为文件类型的Uri才能进行裁剪。


 
private Uri convertUri(Uri uri){
  InputStream is;
  try {
    //Uri ----> InputStream
    is = getContentResolver().openInputStream(uri);
    //InputStream ----> Bitmap
    Bitmap bm = BitmapFactory.decodeStream(is);
    //关闭流
    is.close();
    return saveBitmap(bm, "temp");
  } catch (FileNotFoundException e) {
    e.printStackTrace();
    return null;
  } catch (IOException e) {
    e.printStackTrace();
    return null;
  }
}

下面便是设置裁剪的参数,用隐式Intent方式启动裁剪程序


 
private void startImageZoom(Uri uri){
  //构建隐式Intent来启动裁剪程序
  Intent intent = new Intent("com.android.camera.action.CROP");
  //设置数据uri和类型为图片类型
  intent.setDataAndType(uri, "image
  private void chooseFromCamera() {
    //构建隐式Intent
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    //调用系统相机
    startActivityForResult(intent, CAMERA_CODE);
  }
  
  private void chooseFromGallery() {
    //构建一个内容选择的Intent
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    //设置选择类型为图片类型
    intent.setType("image
  private Uri convertUri(Uri uri){
    InputStream is;
    try {
      //Uri ----> InputStream
      is = getContentResolver().openInputStream(uri);
      //InputStream ----> Bitmap
      Bitmap bm = BitmapFactory.decodeStream(is);
      //关闭流
      is.close();
      return saveBitmap(bm, "temp");
    } catch (FileNotFoundException e) {
      e.printStackTrace();
      return null;
    } catch (IOException e) {
      e.printStackTrace();
      return null;
    }
  }
  
  private Uri saveBitmap(Bitmap bm, String dirPath) {
    //新建文件夹用于存放裁剪后的图片
    File tmpDir = new File(Environment.getExternalStorageDirectory() + "/" + dirPath);
    if (!tmpDir.exists()){
      tmpDir.mkdir();
    }
    //新建文件存储裁剪后的图片
    File img = new File(tmpDir.getAbsolutePath() + "/avator.png");
    try {
      //打开文件输出流
      FileOutputStream fos = new FileOutputStream(img);
      //将bitmap压缩后写入输出流(参数依次为图片格式、图片质量和输出流)
      bm.compress(Bitmap.CompressFormat.PNG, 85, fos);
      //刷新输出流
      fos.flush();
      //关闭输出流
      fos.close();
      //返回File类型的Uri
      return Uri.fromFile(img);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
      return null;
    } catch (IOException e) {
      e.printStackTrace();
      return null;
    }
  }
  
  private void startImageZoom(Uri uri){
    //构建隐式Intent来启动裁剪程序
    Intent intent = new Intent("com.android.camera.action.CROP");
    //设置数据uri和类型为图片类型
    intent.setDataAndType(uri, "image/*");
    //显示View为可裁剪的
    intent.putExtra("crop", true);
    //裁剪的宽高的比例为1:1
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    //输出图片的宽高均为150
    intent.putExtra("outputX", 150);
    intent.putExtra("outputY", 150);
    //裁剪之后的数据是通过Intent返回
    intent.putExtra("return-data", true);
    startActivityForResult(intent, CROP_CODE);
  }
}

注:最后还需要在AndroidManifest文件中加入存储卡读写权限

代码如下:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

您可能感兴趣的文章:Android实现拍照、选择图片并裁剪图片功能浅谈谈Android 图片选择器分享实现Android图片选择的两种方式Android选择图片或拍照图片上传到服务器Android仿微信照片选择器实现预览查看图片Android实现图片选择上传功能实例Android实现本地图片选择及预览缩放效果android完美实现 拍照 选择图片 剪裁等代码分享Android仿微信选择图片和拍照功能Android图片或拍照选择图片功能实例代码


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯