我使用了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)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并将其转换为图像。 谢谢你的帮助!我很感激。