• Android图片处理-相机、相处简单调用


    安卓开发中,常常需要使用到手机相机拍照、或者相册上传头像等等。通过使用Intent,我们很方便地获得相机、相册里面的图片:

    1、相机调用,通过设置File文件路径和文件名,可以将拍照得到的图片保存下来。

    1 //判断本地内存卡是否可用
    2 String store = Environment.getExternalStorageState();
    3 if(store.equals(Environment.MEDIA_MOUNTED)) {
    4   picName = FileUtil.createFileName(20, "jpg");
    5    file = new File(FileUtil.createFileDir(ConfigureUtils.IcoFileDir), picName);
    6    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    7    intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(file));
    8    startActivityForResult(intent, Camera_Data);
    9 }


    2、相册调用

    1 Intent intent = new Intent();
    2 intent.setType("image/*");
    3 intent.setAction(Intent.ACTION_GET_CONTENT);
    4 startActivityForResult(intent, Album_Data);

    3、对Intent获得的数据进行处理:

     1 @Override
     2     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     3         
     4         if(resultCode != RESULT_CANCELED) {
     5             switch (requestCode) {
     6             case Camera_Data:
     7                 if(file.exists()) {
     8                     Log.i("MyApplication","获取拍照文件:"+file.getPath());
     9                     startPhotoZoom(Uri.fromFile(file));
    10                 }
    11                 break;
    12             case Album_Data:
    13                 //获取相册选取的图片
    14                 if(data != null) {
    15                     startPhotoZoom(data.getData());
    16                 }
    17                 break;
    18             case ZoomPhoto:
    19                 Bundle bundle = data.getExtras();
    20                 bitmap = bundle.getParcelable("data");
    21                 picName = FileUtil.createFileName(20, "jpg");
    22                 file = new File(FileUtil.createFileDir(ConfigureUtils.IcoFileDir), picName);
    23                 //输出最后图片到该文件夹
    24                 FileOutputStream out = null;
    25                 try {
    26                     out = new FileOutputStream(file);
    27                     bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
    28                 } catch (FileNotFoundException e) {
    29                     e.printStackTrace();
    30                 } finally {
    31                     try {
    32                         out.flush();
    33                         out.close();
    34                     } catch (IOException e) {
    35                         e.printStackTrace();
    36                     }
    37                     
    38                 }
    39 //                //广播通知有图片更新 (最好用绝对路径)
    40 //                Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);     
    41 //                intent.setData(Uri.fromFile(file));   
    42 //                this.sendBroadcast(intent); 
    43                 
    44                 Map<String,Object> param = new HashMap<String, Object>();
    45                 param.put("post_name", ConfigureUtils.getCurrentUser(UserSettingUploadIcoActivity.this));
    46                 Map<String, File> fileParams = new HashMap<String, File>();
    47                 fileParams.put("file", file);
    48                 uploadPic(ConfigureUtils.changeIco, param, fileParams, handler);
    49 
    50                 break;
    51             default:
    52                 break;
    53             }
    54             
    55         }
    56         super.onActivityResult(requestCode, resultCode, data);
    57     }

    4、头像上传往往需要调用本地相册,也就是将Intent返回的data(Uri)再一次在相册中打开,裁剪处理后再通过Bundle获取到最后裁剪的小图。

     1     private void startPhotoZoom(Uri uri) {
     2         Intent intent = new Intent("com.android.camera.action.CROP");
     3         intent.setDataAndType(uri, "image/*");
     4         // 设置裁剪
     5         intent.putExtra("crop", "true");
     6         // aspectX aspectY 是宽高的比例
     7         intent.putExtra("aspectX", 1);
     8         intent.putExtra("aspectY", 1);
     9         // outputX outputY 是裁剪图片宽高
    10         intent.putExtra("outputX", ConfigureUtils.IcoWidth);
    11         intent.putExtra("outputY", ConfigureUtils.IcoWidth);
    12         intent.putExtra("return-data", true);
    13         startActivityForResult(intent, ZoomPhoto);
    14     }

    5、另外,在上面的一些处理中,用到FileUtil工具类(自己定义的),也贴出来。

     1 public class FileUtil {
     2     /**
     3      * 生成时间和随机数结合的文件名
     4      * @param length  随机数长度
     5      * @param end  文件名后缀,如jpg png
     6      * @return
     7      */
     8     public static String createFileName(int length,String end) {
     9         String filename = null;
    10         String ranStr = RandomNumberUtils.randomString(length);
    11         filename = new DateFormat().format("yyyyMMdd_hhmmss",Calendar.getInstance(Locale.CHINA)) +ranStr+"."+ end;
    12         return filename;
    13     }
    14     
    15     /**
    16      * 创建、获取文件夹
    17      * 默认sd卡根目录+filePath,如/myPicture/
    18      * @return
    19      */
    20     public static File createFileDir(String filePath) {
    21         String sdStatus = Environment.getExternalStorageState();  
    22         if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用  
    23             Log.i("MyApplication",  
    24                     "SD card is not avaiable/writeable right now.");  
    25             return null;  
    26         }  
    27         File file = new File(Environment.getExternalStorageDirectory().getPath()+filePath);
    28         if(!file.exists()) {
    29             file.mkdirs();  //可以创建多级目录
    30         }
    31         return file;
    32     }
    33 }

    下一篇,我们再来说说一些图片的压缩处理。

  • 相关阅读:
    数据分析实战(4)-Kaggle-谷歌数据分析
    东财主力资金异动数据探索分析
    数据分析实战(2)-Kaggle-共享单核数据分析
    爬虫框架Scrapy 之(二) --- scrapy文件介绍
    爬虫框架Scrapy 之(一) --- scrapy整体认识
    atomic
    坑爹的缩写
    一些坑爹的结构体
    sensor hub
    android p 常识
  • 原文地址:https://www.cnblogs.com/chq3272991/p/5316071.html
Copyright © 2020-2023  润新知