Загрузка повернутого изображения в Firebase - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь выполнить следующую задачу:

  1. Выбор изображения из галереи
  2. Поворот изображения (при необходимости) в правильную ориентацию с использованием ExifInterface
  3. Загрузить изображение в 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;
}

1 Ответ

0 голосов
/ 12 января 2019

Чтобы загрузить растровое изображение в хранилище FireBase, вам нужно превратить его в байтовый массив. Вы можете сделать это, создав ByteArrayOutputStream.

ByteArrayOutputStream boas = new ByteArrayOutputStream();

Затем сожмите растровое изображение в формат, подобный JPEG или PNG. Метод сжатия принимает 3 параметра: формат, качество и ByteArrayOutputStream.

bitmap.compress(Bitmap.CompressFormat.JPEG, 100, boas);

Затем создайте ссылку на свой FireBase Storage Reference, куда вы хотите поместить фотографию.

String imageFileName = "ExampleName";    
StorageReference ref = FirebaseStorage.getInstance().getReference().child("images").child(imageFileName);

Здесь я создал папку с именем images и файл внутри, который назван с использованием ранее созданной строки imageFileName

Затем я могу загрузить его в FireBase с помощью UploadTask, сказав

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) {

        }
    });
...