【问题标题】:Shrinking bitmap in Android在 Android 中缩小位图
【发布时间】:2018-07-16 11:28:56
【问题描述】:

我有一个应用程序,用户在其中拍照并将图片加载到 ImageView 中,然后保存在 FirebaseStorage 中。当互联网速度很慢时,我无法从 Firebase(使用 Picasso)获取图像。如何在转换为字节数组并保存到 Firebase 之前减小位图的大小?

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == getActivity().RESULT_OK) {
        Bundle extras = data.getExtras();
        Bitmap imageBitmap = (Bitmap) extras.get("data");
        imageView.setImageDrawable(makeImageRounded(imageBitmap));
        detailViewModel.uploadPhotoToFirebase(imageBitmap); 
    }
}

【问题讨论】:

  • 使用Bitmap.compress()。参见older question
  • 谢谢,我会试试的。我是这个话题的新手,这就是为什么我错过了这个老问题
  • "data" extra 应该是缩略图,请参阅 Taking Photos Simply 了解完整说明,包括如何缩小图像。
  • 我正在使用不同格式(JPEG、PNG)和不同质量(50-30)的 Bitmap.compress() 函数,然后在后端 Firebase 中检查结果图像的大小。这些参数似乎对文件大小没有影响。它介于 80-100KB 之间。我可以进一步压缩吗?

标签: java android picasso android-bitmap


【解决方案1】:

在应用中设置权限

<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

声明 imageView 和 uri

private Uri filePath;
private final int PICK_IMAGE_REQUEST = 71;

Firebase 存储声明

FirebaseStorage storage;
StorageReference storageReference;

在 onCreate 中初始化

存储 = FirebaseStorage.getInstance();存储参考 = storage.getReference();

按钮的 OnClick

 private void chooseImage() {
  Intent intent = new Intent();
  intent.setType("image/*");
  intent.setAction(Intent.ACTION_GET_CONTENT);
  startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
}

onActivityResult 你会得到文件路径

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if(requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK
          && data != null && data.getData() != null )
  {
    filePath = data.getData();
    try {
      Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
      imageView.setImageBitmap(bitmap);
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }
  }
}

将图片上传到 Firebase

private void uploadImage() {

        if(filePath != null)
        {
            StorageReference ref = storageReference.child("images/"+ UUID.randomUUID().toString());
            ref.putFile(filePath)
                    .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                            Toast.makeText(this, "Uploaded", Toast.LENGTH_SHORT).show();
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {


                        }
                    })
                    .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                        }
                    });
        }
    }

减小特定位图的大小以保存在 firebase 上

 public Bitmap getResizedBitmap(Bitmap image, int maxSize) {
    int width = image.getWidth();
    int height = image.getHeight();

    float bitmapRatio = (float)width / (float) height;
    if (bitmapRatio > 1) {
        width = maxSize;
        height = (int) (width / bitmapRatio);
    } else {
        height = maxSize;
        width = (int) (height * bitmapRatio);
    }
    return Bitmap.createScaledBitmap(image, width, height, true);
}

调用方法 - Bitmap converetdImage = getResizedBitmap(bitmap, 500);

【讨论】:

  • 非常感谢。我知道如何将图像上传到 Firebase。问题是:当我不在良好的互联网上时,图像下载速度很慢。我的主要想法是在保存到 Firebase 之前使它们更小。我是图像处理的新手,所以我想知道该怎么做
猜你喜欢
  • 2017-08-27
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多