前端开发入门到精通的在线学习网站

网站首页 > 资源文章 正文

android10中android11中_bitmap缩放大小不一致_解决方案

qiguaw 2024-10-22 14:18:44 资源文章 19 ℃ 0 评论


1.这里主要对拍照后的照片处理,拍照后的照片会传到远程服务器存储起来,但原始照片太大


需要缩小一些.首先拍照:


  public void openCamera(Activity activity) {
        //獲取系統版本
        int currentapiVersion = android.os.Build.VERSION.SDK_INT;
        // 激活相机
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        // 判断存储卡是否可以用,可用进行存储
        if (hasSdcard()) {
            SimpleDateFormat timeStampFormat = new SimpleDateFormat(
                    "yyyy_MM_dd_HH_mm_ss");
            String filename = timeStampFormat.format(new Date());
            tempFile = new File(Environment.getExternalStorageDirectory(),
                    filename + ".jpg");

            if (currentapiVersion < 24) {
                // 从文件中创建uri
                imageUri = Uri.fromFile(tempFile);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
            } else {
                //兼容android7.0 使用共享文件的形式
                ContentValues contentValues = new ContentValues(1);
                contentValues.put(MediaStore.Images.Media.DATA, tempFile.getAbsolutePath());
                //检查是否有存储权限,以免崩溃
                if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        != PackageManager.PERMISSION_GRANTED) {
                    //申请WRITE_EXTERNAL_STORAGE权限
                    Toast.makeText(this,"请开启存储权限",Toast.LENGTH_SHORT).show();
                    return;
                }
                imageUri = activity.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
            }


        }
        // 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CAREMA
        activity.startActivityForResult(intent, PHOTO_REQUEST_CAREMA);
    }



2.以上是拍照代码,用到的中间代码


  /*
     * 判断sdcard是否被挂载
     */
    public static boolean hasSdcard() {
        return Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED);
    }



3.然后拍照以后,对获取到的bitmap照片进行缩放:


   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode) {
            case PHOTO_REQUEST_CAREMA:
                if (resultCode == RESULT_OK) {
                    Intent intent = new Intent("com.android.camera.action.CROP");
                    intent.setDataAndType(imageUri, "image/*");
                    intent.putExtra("scale", true);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
              
                    try {
//1.这里获取bitmap,相机拍摄的照片     
                        Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver()
                                .openInputStream(imageUri));

                        Matrix matrix = new Matrix();

//2.然后这里判断系统的版本,这里如果是29,说明是android10,那么就用0.2的压缩比,原始大小
//30m,能压缩到200k左右
                        Integer  sdkVersion = Integer.valueOf(android.os.Build.VERSION.SDK);

                         if(sdkVersion.equals(29)){ //android10 的时候用 0.2 压缩到200k左右
                             matrix.setScale(0.20f, 0.20f);
                         }else if(sdkVersion.equals(30)){//android11的时候用0.8
//3.如果是android11,那么原始大小1m,压缩比0.9能压缩到200k左右
                             matrix.setScale(0.90f, 0.90f);
                         }else{//其余版本用这个
//4.其余的android版本,用0.8的压缩比,能压缩到100多k,这样基本是可以满足,人脸识别等应用了.
                             matrix.setScale(0.80f, 0.80f);
                         }

//5.压缩后的照片
                        Bitmap bitScaleMap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);

//6.压缩后的照片可以打印大小看看.
                        Log.i("wechat", "压缩后图片的大小" + (bitmap.getByteCount() / 1024 / 1024)
                        + "M宽度为" + bitmap.getWidth() + "高度为" + bitmap.getHeight());

//7.压缩后的bitmap可以保存,这里会有另一个博文说保存这块.
                        tempzmFile = BitmapBaiDuUtils.saveImageReturnAndFile(bitScaleMap,getApplicationContext());
                        //tempzmFile = BitmapBaiDuUtils.saveImageReturnFile(bitmap);

                        picture.setImageBitmap(bitScaleMap);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
                break;
      
        }
    }


本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表