如何在上传到存储之前降低图像质量或分辨率以节省存储空间?

问题描述 投票:0回答:1

大家好,我正在开发一个社交应用程序,其功能是上传图像

我在这个项目中使用Firebase 但对于一个初学者项目,我使用免费计划为我提供5GB存储空间

所以我想知道如何在上传到存储之前降低图像质量或分辨率以节省存储空间

这是我的代码

UploadpostActivity

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent 
data) {
    super.onActivityResult(requestCode, resultCode, data);


    if(requestCode == GALLERY_REQUEST && resultCode ==RESULT_OK ){

        mImageURI = data.getData();
        imgSelector.setImageURI(mImageURI);
    }

}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_upload);

    btnUpload=(Button)findViewById(R.id.upload);
    imgSelector =(ImageView) findViewById(R.id.selectImage);
    postDescription = (EditText)findViewById(R.id.descpost);
    postTitle = (EditText)findViewById(R.id.titlepost);
    mProgress= new ProgressDialog(this);


    btnUpload.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            postnow();
        }
    });
    imgSelector.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent gallerySelectIntent = new 
    Intent(Intent.ACTION_GET_CONTENT);
            gallerySelectIntent.setType("image/*");
            startActivityForResult(gallerySelectIntent,GALLERY_REQUEST);

        }
    });



 }

private void postnow(){


    mProgress.setMessage("Uploading..");
    mProgress.show();


    String title= postTitle.getText().toString().trim();
    String desc = postDescription.getText().toString().trim();


   StorageReference pathfile = FirebaseStorage.getInstance()
           .getReference("UsersImages")
           .child(mImageURI.getLastPathSegment());


    pathfile.putFile(mImageURI)
            .addOnSuccessListener(new 
    OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) 
    {
                    // Get a URL to the uploaded content
                    Uri downloadUrl = taskSnapshot.getDownloadUrl();

                    mProgress.dismiss();
                    Toast.makeText(UploadActivity.this,"Upload 
          Successfully",Toast.LENGTH_LONG).show();
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception exception) {
                    // Handle unsuccessful uploads
                    // ...

                    Toast.makeText(UploadActivity.this,"Something Went Wrong 
       , Error",Toast.LENGTH_LONG).show();
                }
            });

  }
  }

我感谢你的时间

android android-layout android-studio imageview
1个回答
1
投票

通过此方法减小位图的大小并将其上传到服务器..

public static Bitmap resizeBitmapKeepAspectRatio(Bitmap originalImage, int width, int height) {
        Bitmap background = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

        float originalWidth = originalImage.getWidth();
        float originalHeight = originalImage.getHeight();

        Canvas canvas = new Canvas(background);

        float scale = width / originalWidth;

        float xTranslation = 0.0f;
        float yTranslation = (height - originalHeight * scale) / 2.0f;

        Matrix transformation = new Matrix();
        transformation.postTranslate(xTranslation, yTranslation);
        transformation.preScale(scale, scale);

        Paint paint = new Paint();
        paint.setFilterBitmap(true);

        canvas.drawBitmap(originalImage, transformation, paint);

        return cropBitmapTransparency(background);
    }


public static Bitmap cropBitmapTransparency(Bitmap sourceBitmap) {
        int minX = sourceBitmap.getWidth();
        int minY = sourceBitmap.getHeight();
        int maxX = -1;
        int maxY = -1;
        for (int y = 0; y < sourceBitmap.getHeight(); y++) {
            for (int x = 0; x < sourceBitmap.getWidth(); x++) {
                int alpha = (sourceBitmap.getPixel(x, y) >> 24) & 255;
                if (alpha > 0)   // pixel is not 100% transparent
                {
                    if (x < minX)
                        minX = x;
                    if (x > maxX)
                        maxX = x;
                    if (y < minY)
                        minY = y;
                    if (y > maxY)
                        maxY = y;
                }
            }
        }
        if ((maxX < minX) || (maxY < minY))
            return null; // Bitmap is entirely transparent

        // crop bitmap to non-transparent area and return:
        return Bitmap.createBitmap(sourceBitmap, minX, minY, (maxX - minX) + 1, (maxY - minY) + 1);
    }
© www.soinside.com 2019 - 2024. All rights reserved.