简体   繁体   English

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

[英]How Can I Compress Images Before Uploading to Firebase?

I am creating a social network application in which users can post images, so when a user uploads its image, it is of very large size and when I am retrieving that image, it is taking too much time with Picasso.我正在创建一个社交网络应用程序,用户可以在其中发布图像,因此当用户上传其图像时,它的尺寸非常大,当我检索该图像时,毕加索花费了太多时间。 Is there any way to compress those images before uploading without significant quality loss, so that they can be retrieved very efficiently and fast.有什么方法可以在上传之前压缩这些图像而不会造成明显的质量损失,以便可以非常有效和快速地检索它们。 PS: I am using Firebase as a backend Server. PS:我使用 Firebase 作为后端服务器。

Here is my code of uploading images.这是我上传图片的代码。

@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();

                    }
                }
            });
        }
    });

Please help me.请帮我。 Any Help or Suggestion Would Be Appreciable.任何帮助或建议都将不胜感激。 Thanks In Advance.:!提前致谢。:! :) :)

You can simple using Glide to resize your image and using that image to upload to firebase您可以简单地使用 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 function bitmapToByte function

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

hope this helps希望这可以帮助

You can try this way.你可以试试这个方法。 Change this onActivityResult .更改此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();
            }

Here is the getResizedBitmap method you need.这是您需要的 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;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM