在上传到Firebase之前如何压缩图像?

时间:2020-06-29 10:28:17

标签: android image firebase compression

我正在创建一个社交网络应用程序,用户可以在其中发布图像,因此,当用户上传其图像时,它的尺寸非常大,而在检索该图像时,使用毕加索会花费太多时间。 有什么方法可以在上传之前压缩那些图像而不会造成明显的质量损失,从而可以非常有效和快速地检索它们。 附注:我正在将Firebase用作后端服务器。

这是我上传图片的代码。

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

    if(requestCode == Gallery_Pick && resultCode == RESULT_OK && data != null){
        ImageUri = data.getData();
        SelectPostImage.setImageURI(ImageUri);
    }
    super.onActivityResult(requestCode, resultCode, data);
}

final StorageReference filePath = PostImagesRef.child("Post Images").child(ImageUri.getLastPathSegment() + postRandomName + ".jpg");

    final UploadTask uploadTask = filePath.putFile(ImageUri);

    uploadTask.addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            String message = e.toString();
            Toast.makeText(PostActivity.this, "Some Error Occured"+message, Toast.LENGTH_SHORT).show();
            loadingBar.dismiss();
        }
    }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            Toast.makeText(PostActivity.this, "Image Uploaded Successfully", Toast.LENGTH_SHORT).show();
            Task<Uri> urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
                @Override
                public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
                    if(!task.isSuccessful()){
                        throw task.getException();
                    }
                    downloadImageUrl = filePath.getDownloadUrl().toString();

                    return filePath.getDownloadUrl();
                }
            }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                @Override
                public void onComplete(@NonNull Task<Uri> task) {
                    if(task.isSuccessful()){

                        downloadImageUrl = task.getResult().toString();
                        Toast.makeText(PostActivity.this, "Saved To Database Successfully", Toast.LENGTH_SHORT).show();
                        SavingPostInformationToDatabase();

                    }
                }
            });
        }
    });

请帮助我。任何帮助或建议都是可以理解的。 提前致谢。!! :)

2 个答案:

答案 0 :(得分:1)

您可以简单地使用Glide调整图片大小,然后使用该图片上传到Firebase

Glide.with(requireActivity())
                .asBitmap()
                .override(YOUR_IMAGE_SIZE, YOUR_IMAGE_SIZE)
                .load(uri)
                .into(object : CustomTarget<Bitmap>() {
                    override fun onResourceReady(
                        resource: Bitmap,
                        transition: Transition<in Bitmap>?
                    ) {

                        // using bitmapToByte(resource) -> byte
                        // using filePath.putBytes(data) -> uploadTask
                         val filePath = PostImagesRef.child("Post Images").child(ImageUri.getLastPathSegment() + postRandomName + ".jpg")

                         val uploadTask = filePath.putBytes(bitmapToByte(resource))
                    }

                    override fun onLoadCleared(placeholder: Drawable?) {
                        // this is called when imageView is cleared on lifecycle call or for
                        // some other reason.
                        // if you are referencing the bitmap somewhere else too other than this imageView
                        // clear it here as you can no longer have the bitmap
                    }
                })

bitmapToByte功能

 fun bitmapToByte(bitmap: Bitmap): ByteArray {
    val stream = ByteArrayOutputStream()
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream)
    return stream.toByteArray()
}

希望这会有所帮助

答案 1 :(得分:1)

您可以尝试这种方式。更改此 onActivityResult

if(requestCode == Gallery_Pick && resultCode == RESULT_OK && data != null) {
            try {
                Uri imageUri = imageReturnedIntent.getData();
                InputStream imageStream = getContentResolver().openInputStream(imageUri);
                Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);

                selectedImage = getResizedBitmap(selectedImage, 400,300);// 400 and 300 height and width, replace with desired size

                imageView.setImageBitmap(selectedImage); // your desired image


            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }

这是您需要的getResizedBitmap方法。

    public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) {
    int width = bm.getWidth();
    int height = bm.getHeight();
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;

    // create a matrix for the manipulation
    Matrix matrix = new Matrix();

    // resize the bit map
    matrix.postScale(scaleWidth, scaleHeight);

    // recreate the new Bitmap
    Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);

    return resizedBitmap;
}