android调用相机拍照返回的照片大小太小,变得模糊

1、使用相机拍照默认情况下调用相机的方式:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
 startActivityForResult(intent, CAMERA_REQUEST_CODE);//CAMERA_REQUEST_CODE=1一个int表示请求码

在onActivityResult中获取返回的图片:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.i("test=suc", "onActivityResult");
        if (requestCode == CAMERA_REQUEST_CODE && resultCode == Activity.RESULT_OK && data != null) {
            Bundle bundle = data.getExtras();
            if (bundle != null) {
                Bitmap bitmap = (Bitmap) bundle.get("data");
                if (bitmap != null) {
                    mImageView.setImageBitmap(bitmap);
                    //保存Bitmap图片到图库,文件的保存函数我就不写了
                }
            }
        }
    }

你会发现无论是mImageView显示出来的图片,还是自己保存到指定文件夹的图片都横小。那是因为这种方式默认压缩了图片,像素大概188*256大小。

于是我们换一个思路,默认是先从data中获取bitmap(被压缩了),再保存bitmap到本地。我们改为改为先保存到本地(没有压缩),然后从本地读取图片显示,就能显示大图了。

从两种方法的比较看,可以找到被压缩的原因,如果直接返回bitmap,图片太大会影响程序效率,默认就压缩了。如果保存到本地,本地有足够存储空间,系统就没压缩图片。

2、调用相机时候指定保存地址:

private void takePhoto() {
        //获取权限
        getPermission();
        //获取保存位置
        createFile();
        mImageName = "" + System.currentTimeMillis() + ".jpg";
        Intent it = new Intent("android.media.action.IMAGE_CAPTURE");
        it.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mImagePath + mImageName)));
        startActivityForResult(it, REQUEST_TAKEPHOTO_CODE2);
    }

其中getPermission(); 是为了动态获取相机权限,android6.0以上需要动态获取,函数代码继续往下看,

 createFile();是为了为保存的图片指定保存位置,函数代码在后面,

mImagePath, mImageName, 分别表示文件路径和名字,为String类型的全局变量

REQUEST_TAKEPHOTO_CODE2, 是一个int类型的请求标识。

函数代码如下:com.zhengyuan.learningtakephoto是自己项目的包名

private void getPermission() {
        PackageManager pm = getPackageManager();
        boolean permission = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.CAMERA", "com.zhengyuan.learningtakephoto"));
        if (!permission) {
            //没有权限
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                requestPermissions(new String[]{Manifest.permission.CAMERA}, 15);
            }
        }
        permission = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.READ_EXTERNAL_STORAGE", "com.zhengyuan.learningtakephoto"));
        if (!permission) {
            //没有权限
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 15);
            }
        }
        permission = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.WRITE_EXTERNAL_STORAGE", "com.zhengyuan.learningtakephoto"));
        if (!permission) {
            //没有权限
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 15);
            }
        }
    }


/**
     * 创建保存图片的文件夹
     */
    public void createFile() {
        mImagePath = Environment.getExternalStorageDirectory() + "/mypp/";//指定保存路径
        File f = new File(mImagePath);
        if (!f.exists()) {
            f.mkdir();
        }
    }

拍照完成后再onActivityResult显示保存到本地的图片:

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        else if (requestCode == REQUEST_TAKEPHOTO_CODE2&& data != null) {
            try {
                Bitmap bm = BitmapFactory.decodeFile(mImagePath + mImageName);
                Bitmap take = ResizeBitmap(bm, 640);
                mImageView2.setImageBitmap(take);
                bm.recycle();//太大记得回收
                //处理完记得回收take
                //take.recycle();
            } catch (Exception e) {
            }
        }
    }

上面变量中有两个bitmap,bm是直接从本地读取的,太大,为了适应手机显示,压缩成take显示。压缩函数如下:

public static Bitmap ResizeBitmap(Bitmap bitmap, int newWidth) {//拍照的图片太大,设置格式大小
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        float temp = ((float) height) / ((float) width);
        int newHeight = (int) ((newWidth) * temp);
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        Matrix matrix = new Matrix();
        // resize the bit map
        matrix.postScale(scaleWidth, scaleHeight);
        // matrix.postRotate(45);
        Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
        bitmap.recycle();
        return resizedBitmap;
    }

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值