将旋转图像上传到 Firebase
Uploading Rotated Image to Firebase
我正在尝试完成以下任务:
- 正在从图库中选择图像
- 使用 ExifInterface 将图像旋转(如有必要)到正确的方向
- 将图片上传到 Firebase
问题
如果图像需要旋转,我将得到一个旋转的位图文件。我如何将此位图文件转换为 Uri 以便我可以上传到 Firebase?
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == GALLERY_INTENT && resultCode == Activity.RESULT_OK) {
mImageUri = data.getData();
try{
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getApplicationContext().getContentResolver(),mImageUri);
rotatedBitmap = rotateImageIfRequired(getContext(), bitmap, mImageUri);
mVideoImage.setImageBitmap(rotatedBitmap);
imageHeight = bitmap.getHeight();
imageWidth = bitmap.getWidth();
}catch (IOException e){
e.printStackTrace();
}
}
private static Bitmap rotateImageIfRequired(Context context, Bitmap img, Uri selectedImage) throws IOException {
InputStream input = context.getContentResolver().openInputStream(selectedImage);
ExifInterface ei;
if (Build.VERSION.SDK_INT > 23)
ei = new ExifInterface(input);
else
ei = new ExifInterface(selectedImage.getPath());
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
return rotateImage(img, 90);
case ExifInterface.ORIENTATION_ROTATE_180:
return rotateImage(img, 180);
case ExifInterface.ORIENTATION_ROTATE_270:
return rotateImage(img, 270);
default:
return img;
}
}
private static Bitmap rotateImage(Bitmap img, int degree) {
Matrix matrix = new Matrix();
matrix.postRotate(degree);
Bitmap rotatedImg = Bitmap.createBitmap(img, 0, 0, img.getWidth(), img.getHeight(), matrix, true);
img.recycle();
return rotatedImg;
}
要将位图上传到 FireBase 存储中,您需要将其转换为字节数组。您可以通过创建一个 ByteArrayOutputStream 来做到这一点。
ByteArrayOutputStream boas = new ByteArrayOutputStream();
然后将位图压缩成 JPEG 或 PNG 等格式。压缩方法有 3 个参数,格式、质量和 ByteArrayOutputStream。
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, boas);
然后创建一个对您的 FireBase 存储引用的引用,您要在其中放置照片。
String imageFileName = "ExampleName";
StorageReference ref = FirebaseStorage.getInstance().getReference().child("images").child(imageFileName);
在这里,我创建了一个名为 'images' 的文件夹和一个使用之前创建的 imageFileName String
命名的文件
然后我可以通过说
使用 UploadTask 将其上传到 FireBase
UploadTask task = ref.putBytes(data);
使用此任务,您可以创建成功和失败侦听器。
task.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});
我正在尝试完成以下任务:
- 正在从图库中选择图像
- 使用 ExifInterface 将图像旋转(如有必要)到正确的方向
- 将图片上传到 Firebase
问题
如果图像需要旋转,我将得到一个旋转的位图文件。我如何将此位图文件转换为 Uri 以便我可以上传到 Firebase?
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == GALLERY_INTENT && resultCode == Activity.RESULT_OK) {
mImageUri = data.getData();
try{
Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getApplicationContext().getContentResolver(),mImageUri);
rotatedBitmap = rotateImageIfRequired(getContext(), bitmap, mImageUri);
mVideoImage.setImageBitmap(rotatedBitmap);
imageHeight = bitmap.getHeight();
imageWidth = bitmap.getWidth();
}catch (IOException e){
e.printStackTrace();
}
}
private static Bitmap rotateImageIfRequired(Context context, Bitmap img, Uri selectedImage) throws IOException {
InputStream input = context.getContentResolver().openInputStream(selectedImage);
ExifInterface ei;
if (Build.VERSION.SDK_INT > 23)
ei = new ExifInterface(input);
else
ei = new ExifInterface(selectedImage.getPath());
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
return rotateImage(img, 90);
case ExifInterface.ORIENTATION_ROTATE_180:
return rotateImage(img, 180);
case ExifInterface.ORIENTATION_ROTATE_270:
return rotateImage(img, 270);
default:
return img;
}
}
private static Bitmap rotateImage(Bitmap img, int degree) {
Matrix matrix = new Matrix();
matrix.postRotate(degree);
Bitmap rotatedImg = Bitmap.createBitmap(img, 0, 0, img.getWidth(), img.getHeight(), matrix, true);
img.recycle();
return rotatedImg;
}
要将位图上传到 FireBase 存储中,您需要将其转换为字节数组。您可以通过创建一个 ByteArrayOutputStream 来做到这一点。
ByteArrayOutputStream boas = new ByteArrayOutputStream();
然后将位图压缩成 JPEG 或 PNG 等格式。压缩方法有 3 个参数,格式、质量和 ByteArrayOutputStream。
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, boas);
然后创建一个对您的 FireBase 存储引用的引用,您要在其中放置照片。
String imageFileName = "ExampleName";
StorageReference ref = FirebaseStorage.getInstance().getReference().child("images").child(imageFileName);
在这里,我创建了一个名为 'images' 的文件夹和一个使用之前创建的 imageFileName String
命名的文件然后我可以通过说
使用 UploadTask 将其上传到 FireBaseUploadTask task = ref.putBytes(data);
使用此任务,您可以创建成功和失败侦听器。
task.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});