栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

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

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

今天看《第一行代码》上面关于拍照和从相册选取图片那一部分,发现始终出不来效果,所以搜索其他资料学习一下相关知识,写一个简单的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文件中加入存储卡读写权限

复制代码 代码如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/161709.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号