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

将图像上传到Firebase存储的最佳实践和代码

令狐烨烨
2023-03-14

我使用了3种不同的代码来测试上传到Firebase存储的图像文件的大小。(图像的原始大小为12.3 MB)

第一个代码将uri转换为位图,并将其放在ImageView上,将其压缩为PNG格式,最后将图像上传到Firebase存储。

上载的格式:。巴布亚新几内亚。上传后的大小:14.82 MB。

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

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

            Uri uri = data.getData();

            try {
                Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uri);
                mImageView.setImageBitmap(bitmap);
            } catch (IOException e) {
                e.printStackTrace();
            }

            String randomName = UUID.randomUUID().toString() + ".png";

            StorageReference filePath = mStorage.child("feed_photos").child(randomName);

            mImageView.setDrawingCacheEnabled(true);
            mImageView.buildDrawingCache();
            Bitmap bitmap2 = ((BitmapDrawable) mImageView.getDrawable()).getBitmap();

            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            bitmap2.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
            mImageView.setDrawingCacheEnabled(false);
            byte[] data2 = outputStream.toByteArray();

            UploadTask uploadTask = filePath.putBytes(data2);

            progressDialog.setMessage("uploading...");
            progressDialog.show();

            uploadTask.addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception exception) {
                    Toast.makeText(getContext(), "UPLOAD FAILED", Toast.LENGTH_SHORT).show();
                }
            }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    progressDialog.dismiss();
                }
            });
        }
    }

第二个代码与第一个代码相同,但将其转换为JPEG。

上传格式。JPEG。上传后的大小5.58 MB。

第二个代码与第一个代码的差异:

bitmap2。压缩(Bitmap.CompressFormat.JPEG,100,outputStream)//这次是JPEG

第三个代码直接将图像从手机存储器上传到firebase存储器。

上传格式。JPEG。上传后的大小3.41 MB。

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

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

            Uri uri = data.getData();

            String randomName = UUID.randomUUID().toString() + ".png";

            StorageReference filePath = mStorage.child("feed_photos").child(randomName);

            UploadTask uploadTask = filePath.putFile(uri);

            progressDialog.setMessage("uploading...");
            progressDialog.show();

            uploadTask.addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception exception) {
                    Toast.makeText(getContext(), "UPLOAD FAILED", Toast.LENGTH_SHORT).show();
                }
            }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    progressDialog.dismiss();
                }
            });
        }

上传后,我比较了来自Firebase存储的三张图片,三张图片的质量似乎没有任何差异。这就提出了一个问题:当JPEG的图像尺寸较小时,为什么要在巴布亚新几内亚上传(Q1)?此外,即使是3.41 MB的最小文件大小也相当大,特别是如果应用程序有大量用户定期上传图像。在这种情况下,通常接受的要存储的图像大小是什么,以保持与Whatsapp(Q2)相当的图像质量。

另外,在第三段代码中,我没有编写任何压缩代码。然而,它似乎还是以最小的图像大小上传。那么,为什么教程首先要压缩图像(Q3)?(原始图像大小为12.3 MB)

这些问题让我困惑,我应该使用什么代码和最佳实践来将图像上传到Firebase存储。

我希望我的应用程序做什么(主要问题):

用户从手机的图像库中选择图像,图像弹出到ImageView上,以便用户可以将标题作为元数据添加到其中。当用户确认时,图像及其元数据被上传到Firebase存储。ImageView和下载后的图像质量可能与Whatsapp的图像相当。因此,实现这一目标的适当代码和最佳实践是什么?如果在主要问题之前先回答前三个问题(Q1、2和3),将会有所帮助。很抱歉,因为我是新的Android开发和自我学习。提前感谢!

额外:我没有提到从firebase存储下载图像,但我计划使用firebaseui和glide来完成。希望这没问题。


共有1个答案

容飞掣
2023-03-14

1)PNG是无损的。jpg是有损压缩。这意味着PNG可以准确地解码为原始图像,而jpg不能(数据和质量在压缩中丢失)。如果你有一个文件,你想保持在高质量,你需要PNG。请注意,根据您保存jpg时使用的Q因子和图像类型,您可能看不到明显的质量差异。

2) 您将其保存为JPG和PNG。这些已经是压缩文件格式了。完全解压缩的bmp文件甚至更大。

3)上传任务用什么Q因子保存数据?我的猜测相当低。这对某些类型的图像来说很好。但是Q因子越低,文件越小(但是压缩损失越大)。如果不知道这一点,你就不会比较同等的东西。

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

  • 问题内容: 我想将图像的下载URL放入Firebase数据库中。我可以将图像上传到存储中,但无法弄清楚如何将URL与其余的“帖子”一起放入数据库。 问题答案: 像这样组织您和func: 接下来,只需连接并保存到您的节点即可。 您也可以查看我有关上传数据并将URL保存到数据库的答案 希望能帮助到你

  • 我试图上传一个图像文件,我得到了使用Imagepicker。 但上面的代码返回以下错误 VERBOSE-2:ui\u dart\u状态。cc(186)]未处理的异常:MissingPluginException(未找到方法任务的实现#通道插件上的startPutFile.flatter.io/firebase_存储)#0 MethodChannel_invokeMethod包:flatter/..

  • 我在SQLite数据库中有一个图像作为BLOB类型,我想将该图像上传到firebase存储中,获取图像的下载URL和尺寸,并将它们添加到Firebase实时数据库中。我已使用 bucket.upload 从本地驱动器成功上传了图像,但我不知道如何上传 blob。 我在服务器端(NodeJS)使用admin-sdk,有一个“上传”功能,但那是在客户端sdk中。

  • 我有一个问题与我的代码,我必须上传图像到Firebase存储,我需要的图像来自画廊和相机,从画廊的图像是好的,但来自相机的图像给问题,图像加载在ImageView和被发送到数据库是黑色的。有人知道如何解决这个问题吗,或者你知道任何其他加载图像的方法吗? 来自画廊 从相机

  • 我正在尝试上传图像到firebase,以及其他字符串和双数据类型。 我现在正在考虑两个选项,一个是上载imageUrl到firebase实时数据库,当我检索它时,我将检索一个imageUrl并将其转换为图像。 谢谢你的帮助!我很感激。