当前位置: 首页 > 知识库问答 >
问题:

如何在将图像上载到firebase存储之前压缩图像?

吕鹏
2023-03-14

我想在上传到Firebase存储之前减小图像文件大小,因为上传需要很长时间。

这是conatins编辑文本图像视图的表单

单击“保存”按钮时,我同时保存数据(在实时数据库中)和图像(存储)。

那么如何减少图像大小或压缩它呢??

public class PDV_form extends AppCompatActivity {

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_pdv_form);
     imgproduit.setOnClickListener(new View.OnClickListener() {
         @Override
        public void onClick(View v) {
            selectImage();
         }
    });

    Save.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
             rootNode = FirebaseDatabase.getInstance("https://dtechapp-94795-default-rtdb.europe-west1.firebasedatabase.app");
            reference = rootNode.getReference().child("pdv");

            String nomcmplt = nomCmplt.getEditText().getText().toString();
            String nompdv = nomPdv.getEditText().getText().toString();
            String phone = Phone.getEditText().getText().toString();
            String adresse = Adresse.getEditText().getText().toString();
            String commune = Commune.getEditText().getText().toString();
            String wilaya = Wilaya.getEditText().getText().toString();
            String codezip = Zip.getEditText().getText().toString();
            String email = Email.getEditText().getText().toString();
            String imagepdv = placeimgpdv.getDrawable().toString().trim();
                 UploadDialog = new ProgressDialog(PDV_form.this);
                UploadDialog.setTitle("Sauvegarde en cours.... ");
                UploadDialog.show();

                SimpleDateFormat formatter = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss", Locale.FRANCE);
                Date now = new Date();
                String fileName = formatter.format(now);
                storageReference = FirebaseStorage.getInstance().getReference("pdv/" + fileName);
                storageReference.putFile(imageUri)
                        .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                            @Override
                            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                                placeimgpdv.setImageURI(null);
                                Toast.makeText(PDV_form.this, "Sauvegarde Terminée", Toast.LENGTH_SHORT).show();
                                if (UploadDialog.isShowing())
                                    UploadDialog.dismiss();

                            }
                        }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                         if (UploadDialog.isShowing())
                            UploadDialog.dismiss();
                        Toast.makeText(PDV_form.this, "Sauvegarde Annulée", Toast.LENGTH_SHORT).show();
                     }
                });

                StorageReference filpath = storageReference;
                filpath.putFile(imageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        Task<Uri> downloadurl = taskSnapshot.getStorage().getDownloadUrl().addOnCompleteListener(new OnCompleteListener<Uri>() {
                            @Override
                            public void onComplete(@NonNull @NotNull Task<Uri> task) {
                                String t = task.getResult().toString();
                                DatabaseReference newPost = reference.child(nomcmplt + "(" + nompdv + ")");
                                newPost.child("nomcmplt").setValue(nomcmplt);
                                newPost.child("nompdv").setValue(nompdv);
                                newPost.child("phone").setValue(phone);
                                newPost.child("adresse").setValue(adresse);
                                newPost.child("commune").setValue(commune);
                                newPost.child("wilaya").setValue(wilaya);
                                newPost.child("codezip").setValue(codezip);
                                newPost.child("email").setValue(email);
                                newPost.child("imagepdv").setValue(task.getResult().toString());
                                newPost.child("user_id").setValue(uid);

                                if (task.isSuccessful()) {
                                    startActivity(new Intent(PDV_form.this, Bottom_bar.class));
                                }
                            }
                        });
                    }
                });

         }
    });

}

private void selectImage() {

    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("image/*");
    // intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
    startActivityForResult(intent, Gallery_code);

}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == Gallery_code && resultCode == RESULT_OK) {
        imageUri = data.getData();
        placeimgpdv.setImageURI(imageUri);

    }
}
}

共有1个答案

束福
2023-03-14

您要问两个问题,一个是减小图像的大小,另一个是压缩图像。我想你是想通过缩小图像的大小而不是压缩它来压缩图像,这是一种有损的方式。如果这不是你在评论中的意思,请告诉我。

您可以选择手动构建解决方案。Python有很多很好的库可以帮助您做到这一点,对于java,我确实找到了一些沿着这个方向工作的好资源,所以这个问题似乎很好-我如何使用java压缩图像?

另一种选择是使用SaaS工具。这将真正简化你的过程,对于像这样简单的东西,它甚至可能不会花费任何东西,除非你压缩了很多图像,或者非常非常大的图像。作为起点,您可以查看TinyPNG-https://tinypng.com/.他们有一个开发人员API-https://tinypng.com/developers.

编辑:根据有关音量的新信息,更新我的答案。因为您期望的图像量很低,所以可以只使用TinyPNG。这是非常简单的开始。您可以注册,然后获得API密钥。他们有一个很好的API,可以在Java中使用-https://tinypng.com/developers/reference/java

 类似资料:
  • 我制作了一个用于图像和视频共享的社交应用程序。但是,加载图像需要花费太多时间。我正在使用glide图书馆。请告诉我如何在图像质量没有明显变化的情况下(如Instagram)缩小从gallery中拾取的图像的大小,然后将其上载到firebase存储。请帮忙!

  • 我正在开发应用程序,用户必须上传多个图像。现在我面临的问题是他们的规模。由于用户可以上传多个图像,这需要大量的时间来通过应用程序上传它们,因为它们太大了,用户不喜欢,也使我的应用程序和数据库沉重。你能指导我如何在上传多张图片到firebase之前压缩它们吗? 用于压缩图像的代码 模特班 } 引发异常

  • 我从Firebase存储中获取图像,用相机拍照,或者从图书馆中挑选一张。当其中一个完成时,我有一个类来存储,以便在需要时使用它。 现在我需要将此图像上传到Firebase存储(修改或新建,无所谓)。Firebase允许我使用以下选项之一:或,每个选项分别需要或。 我怎么能把我的,并从它获得一个或用于上传? -- 或者,为了解决这个问题,当我从Firebase存储中检索图像时,如何获取图像的? 无论

  • 我试图在Firebase存储中使用Firebase上传图像,但文件不能完全上传。它只显示图像的大小9字节,下载时无法预览。 这是我使用的代码:- 我使用的反应本地图像作物选择器。我使用Firebase,但不是反应本机Firebase。请帮助!

  • 我想上传图片到存储区。每次我启动我的模拟器时,我都没有错误,而且一切都运行得很好,只是当我在模拟器中选择图片并上传它们时,即使在我刷新之后,它也不会显示在Firebase存储区中。下面是我的代码:

  • 在上传到服务器之前,我使用了下面的方法来压缩图像。 为了总结下面的代码,我首先从phone/sdcard上获取图像,将其转换为位图,并对位图进行缩放和压缩。然后我将压缩后的位图保存在磁盘上,作为新位置的图像。 这种方法可以将图像从3mb-5mb压缩到30-100kb。(当我检查SD卡上的压缩图像大小时) 然后,我将新压缩的30-100kb图像转换为位图字符串(通过Base64.encodeToSt