Изображение повернуто на 90 градусов после кодирования в Base64 - PullRequest
0 голосов
/ 11 декабря 2019

Я использую GalleryIntent, чтобы выбрать изображение из галереи, и после этого я кодирую это image to Base64, но в этом процессе после кодирования изображения в Base64 я увидел, что изображение повернуто до 90 degree.

Вот мой код: -

public class ImagePickerModule extends ReactContextBaseJavaModule {

    private static final int IMAGE_PICKER_REQUEST = 121;
    private static final String E_ACTIVITY_DOES_NOT_EXIST = "E_ACTIVITY_DOES_NOT_EXIST";
    private static final String E_PICKER_CANCELLED = "E_PICKER_CANCELLED";
    private static final String E_FAILED_TO_SHOW_PICKER = "E_FAILED_TO_SHOW_PICKER";
    private static final String E_NO_IMAGE_DATA_FOUND = "E_NO_IMAGE_DATA_FOUND";

    private Promise mPickerPromise;

    private final ActivityEventListener mActivityEventListener = new BaseActivityEventListener() {

        @Override
        public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent intent) {
            if (requestCode == IMAGE_PICKER_REQUEST) {
                if (mPickerPromise != null) {
                    if (resultCode == Activity.RESULT_CANCELED) {
                        mPickerPromise.reject(E_PICKER_CANCELLED, "Cancelled");
                    } else if (resultCode == Activity.RESULT_OK) {
                        Uri uri = intent.getData();
                        if (uri == null) {
                            mPickerPromise.reject(E_NO_IMAGE_DATA_FOUND, "Cancelled");
                        } else {
                            mPickerPromise.resolve(uri.toString());
                        }
                    }

                    mPickerPromise = null;
                }
            }
        }
    };

    @ReactMethod
    public String encodeImage(String url, final Promise promise) {
        Uri uri = Uri.parse(url);
        byte[] b;
        InputStream imageStream;
        try {
            imageStream = getReactApplicationContext().getContentResolver().openInputStream(uri);
            final Bitmap image = BitmapFactory.decodeStream(imageStream);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            image.compress(Bitmap.CompressFormat.JPEG, 40, baos);
            b = baos.toByteArray();
            try {
                promise.resolve(Base64.encodeToString(b, Base64.DEFAULT));
                image.recycle();
            } catch (OutOfMemoryError e) {
                Log.e("OutOfMemoryError", "encodeImage: e");
            } catch (RuntimeException err) {
                Log.e("RuntimeException", "encodeImage: e");
            }
        } catch (Exception e) {
            promise.reject("File Not Found Exception", "File not Found");
            e.printStackTrace();
        }
        return url;
    }

    ImagePickerModule(ReactApplicationContext reactContext) {
        super(reactContext);
        reactContext.addActivityEventListener(mActivityEventListener);
    }

    @NonNull
    @Override
    public String getName() {
        return "ImagePicker";
    }

    @ReactMethod
    public void pickImage(final Promise promise) {

        Activity currentActivity = getCurrentActivity();

        if (currentActivity == null) {
            promise.reject(E_ACTIVITY_DOES_NOT_EXIST, "Activity doesn't exist");
            return;
        }

        if (ContextCompat.checkSelfPermission(currentActivity, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(currentActivity, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 101);
        }

        // Store the promise to resolve/reject when picker returns data
        mPickerPromise = promise;

        try {
            final Intent galleryIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            currentActivity.startActivityForResult(galleryIntent, IMAGE_PICKER_REQUEST);
        } catch (Exception e) {
            mPickerPromise.reject(E_FAILED_TO_SHOW_PICKER, e);
            mPickerPromise = null;
        }
    }
}

Я использую это как собственный модуль в моем собственном проекте реакции. Я пытался таким образом Android получить изображение из галереи повернуло

, но это мне не помогло.

Если кто-нибудь знает решение, то помогите мне. Заранее спасибо:)

1 Ответ

1 голос
/ 11 декабря 2019

У меня была та же проблема, и я решил ее следующим образом:

Шаг 1: Добавить зависимость gradle для Exif Особенности:

implementation 'androidx.exifinterface:exifinterface:1.0.0'

Шаг 2: Прочитайте информацию Exif этого файла, содержащую дополнительную информацию о файле, например, его поворот или географическое положение. При этом вы можете получить начальное вращение и повернуть его, чтобы правильно отобразить изображение:

try
{
     InputStream inputStream = activity.getContentResolver().openInputStream(intent.getData()); // intent is parameter from onActivityResult()
     ExifInterface exif = new ExifInterface(inputStream);
     int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
     inputStream.close();

    if (orientation == 6)
    {
        // Rotation 90°
    }
    else if (orientation == 3)
    {
        // Rotation 180°
    }
    else if (orientation == 8)
    {
        // Rotation 270°
    }
} catch (IOException e)
{
    e.printStackTrace();
}

Шаг 3: Поверните изображение, чтобы показать его правильно:

Matrix matrix = new Matrix();
matrix.postRotate(degrees); // Degrees calculated in Step 2

Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
...