码迷,mamicode.com
首页 > 移动开发 > 详细

Android调用系统相机拍照保存照片很小解决方案

时间:2015-10-09 23:00:04      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:

保存图片小的一般操作步骤:

1. 调用系统相机

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 1); 

2. 保存照片

@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  // TODO Auto-generated method stub
  super.onActivityResult(requestCode, resultCode, data);
  System.out.println("onActivityResult start");
  
  if (resultCode == Activity.RESULT_OK) {
   System.out.println("enter");
        String sdStatus = Environment.getExternalStorageState(); 
        if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用 
            Log.i("TestFile", 
                    "SD card is not avaiable/writeable right now.");
            System.out.println("SD card is not avaiable/writeable right now.");
            return; 
        } 
        String name = System.currentTimeMillis() + ".jpg";;    
        //Toast.makeText(this, name, Toast.LENGTH_LONG).show(); 
        Bundle bundle = data.getExtras(); 
        Bitmap bitmap = (Bitmap) bundle.get("data");// 获取相机返回的数据,并转换为Bitmap图片格式 
     
        FileOutputStream b = null; 
        File file = new File("/mnt/sdcard/DCIM/Camera/"); 
        file.mkdirs();// 创建文件夹 
        System.out.println("mkdirs");
        String fileName = "/mnt/sdcard/DCIM/Camera/"+name; 
 
            try { 
                b = new FileOutputStream(fileName); 
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);// 把数据写入文件 
        } catch (FileNotFoundException e) { 
            e.printStackTrace();
        } finally { 
            try { 
                b.flush(); 
                b.close(); 
            } catch (IOException e) { 
                e.printStackTrace();
            } 
        } 
 

小图片的造成的原因,从返回值中取照片的数据是已经被压缩了,要想不被压缩我们可以在调用系统相机时指定照片的保存位置

 private String camera_path = Environment.getExternalStorageDirectory().toString() + "/Photo_LJ/";//照片保存位置

 private String camera_photo_name;// 保存的名称




Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File path1 = new File(camera_path); if (!path1.exists()) { path1.mkdirs(); } camera_photo_name = System.currentTimeMillis() + ".jpg"; File file = new File(path1, camera_photo_name); // mOutPutFileUri = Uri.fromFile(file); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); startActivityForResult(intent, 1);

重载方法

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
        case TAKE_PICTURE:
            if (resultCode == RESULT_OK) 
                String filename = camera_path + "/" + camera_photo_name;
                Bitmap bm = compressImageFromFile(filename);

                ImageItem takePhoto = new ImageItem();
                takePhoto.setBitmap(bm);
                Bimp.tempSelectBitmap.add(takePhoto);
            }
            break;
        }

照片很大,要显示出来我们最好对它进行一下压缩

private Bitmap compressImageFromFile(String srcPath) {
        BitmapFactory.Options newOpts = new BitmapFactory.Options();
        newOpts.inJustDecodeBounds = false;// 只读边,不读内容
        Bitmap bitmap = BitmapFactory.decodeFile(srcPath, null);

        newOpts.inJustDecodeBounds = false;
        int w = newOpts.outWidth;
        int h = newOpts.outHeight;
        float hh = 800f;//
        float ww = 480f;//
        int be = 1;
        if (w > h && w > ww) {
            be = (int) (newOpts.outWidth / ww);
        } else if (w < h && h > hh) {
            be = (int) (newOpts.outHeight / hh);
        }
        if (be <= 0)
            be = 1;
        newOpts.inSampleSize = be;// 设置采样率

        // newOpts.inPreferredConfig = Config.ARGB_8888;//该模式是默认的,可不设
        newOpts.inPurgeable = true;// 同时设置才会有效
        newOpts.inInputShareable = true;// 。当系统内存不够时候图片自动被回收

        bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
        // return compressBmpFromBmp(bitmap);//原来的方法调用了这个方法企图进行二次压缩
        // 其实是无效的,大家尽管尝试
        return bitmap;
    }

 

好了,可以到照片保存的位置检查一下了,已经是2M左右大小的照片了。

 

Android调用系统相机拍照保存照片很小解决方案

标签:

原文地址:http://www.cnblogs.com/wicrecend/p/4865154.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!