【发布时间】:2018-01-31 11:15:31
【问题描述】:
我使用了 3 种不同的代码来测试上传到 Firebase 存储的图像文件的大小。 (图片的原始大小为 12.3 MB)
first 代码将 uri 转换为位图并将其放置在 ImageView 上,将其压缩为 PNG 格式,最后将图像上传到 firebase 存储。
上传格式:.PNG。上传后大小: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.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); //JPEG this time!
第三个代码直接将图片从手机存储上传到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 storage中的三张图片,三张图片的质量似乎没有什么区别。这就提出了一个问题,为什么在较小的 JPEG 图像尺寸(Q1)的情况下上传 PNG?此外,即使是 3.41 MB 的最小文件大小也相当大,特别是如果该应用程序拥有大量用户群并定期上传图像。在这种情况下,保持图像质量可与 Whatsapp (Q2) 相媲美的普遍接受的要存储的图像大小是多少。
另外,在第三个代码中,我没有写任何压缩代码。但是,无论如何,它似乎以最小的图像大小上传。那么为什么教程边界甚至首先压缩图像(Q3)? (原始图像大小为 12.3 MB)
这些问题让我很困惑,我应该使用什么代码和最佳实践将图像上传到 Firebase 存储。
我希望我的应用做什么(主要问题):
用户从手机的图片库中选择图片,图片会弹出到 ImageView 上,这样用户就可以为其添加标题作为元数据。当用户确认后,图像及其元数据将上传到 Firebase 存储。 ImageView 和下载后的图像质量可能与 Whatsapp 的图像相当。因此,实现这一目标的正确代码和最佳实践是什么?如果在主要问题之前先回答前 3 个问题(Q1、2 和 3)会很有帮助。很抱歉,因为我是 android 开发的新手并且是自学的。提前致谢!
补充:我还没有谈到从 firebase 存储中下载图像,但我打算使用带有 glide 的 firebaseui 来完成。希望没问题。
【问题讨论】:
标签: android image file-upload bitmap firebase-storage