Как я могу редактировать данные EXIF ​​моего изображения для поворота изображения - PullRequest
0 голосов
/ 03 октября 2019

В моем приложении пользователь получает изображение с камеры или галереи, затем эти изображения преобразуются в PDF. Теперь моя проблема заключается в том, что на некоторых устройствах изображение, полученное с помощью камеры, поворачивается на 90 градусов, в частности, это устройства Samsung. S7,

Я знаю, что мне нужно отредактировать EXIF-данные изображения, но я новичок в Android, и все данные EXIF ​​полностью у меня в голове, любая помощь будет признательна

Здесь я вызываю выбранное изображение и преобразовываю его в PDF

  PdfDocument document=new PdfDocument();
    // crate a page description
    PdfDocument.PageInfo pageInfo;
    PdfDocument.Page page;
    Canvas canvas;
    int i;

Растровое изображение;

    for (i=0; i < list.size(); i++)  {


        pageInfo=new PdfDocument.PageInfo.Builder(992, 1432, 1).create();
        page=document.startPage(pageInfo);
        canvas=page.getCanvas();
        image=BitmapFactory.decodeFile(list.get(i));
        image = Bitmap.createScaledBitmap(image, 980, 1420, true);
        image.setDensity(DisplayMetrics.DENSITY_300);
        canvas.setDensity(DisplayMetrics.DENSITY_300);
        canvas.drawBitmap(image, 0, 0, null);
        document.finishPage(page);
    }
    @SuppressWarnings("deprecation") String directory_path=Environment.getExternalStorageDirectory().getPath() + "/mypdf/";
        File file=new File(directory_path);
        if (!file.exists()) {
            //noinspection ResultOfMethodCallIgnored
            file.mkdirs();
        }
        @SuppressLint("SimpleDateFormat") String timeStamp=(new SimpleDateFormat("yyyyMMdd_HHmmss")).format(new Date());
        String targetPdf=directory_path + timeStamp + ".pdf";
        File filePath=new File(targetPdf);
        try {
            document.writeTo(new FileOutputStream(filePath));

        } catch (IOException e) {
            Log.e("main", "error " + e.toString());
            Toasty.error(this, "Error making PDF" + e.toString(), Toast.LENGTH_LONG).show();
        }
        // close the document
        document.close();

1 Ответ

1 голос
/ 03 октября 2019

Добавьте это к своему сборщику сборки:

implementation 'androidx.exifinterface:exifinterface:1.0.0'

получите данные вращения:

    Bitmap bitmap = BitmapFactory.decodeFile(path);
         ExifInterface exif;
                        try {
                            exif = new ExifInterface(path);
                            int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                                    ExifInterface.ORIENTATION_UNDEFINED);
                             Bitmap bmRotated = MyUtility.rotateBitmap(bitmap, orientation);
}
 } catch (IOException e) {
                    e.printStackTrace();
                }

Метод rotateBitmap ():

public static Bitmap rotateBitmap(Bitmap bitmap, int orientation) {

        Matrix matrix = new Matrix();
        switch (orientation) {
            case ExifInterface.ORIENTATION_NORMAL:
                mLog.i(TAG,"normal");
                return bitmap;
            case ExifInterface.ORIENTATION_FLIP_HORIZONTAL:
                mLog.i(TAG,"ORIENTATION_FLIP_HORIZONTAL");
                matrix.setScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                mLog.i(TAG,"ORIENTATION_ROTATE_180");
                matrix.setRotate(180);
                break;
            case ExifInterface.ORIENTATION_FLIP_VERTICAL:
                mLog.i(TAG,"ORIENTATION_FLIP_VERTICAL");
                matrix.setRotate(180);
                matrix.postScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_TRANSPOSE:
                matrix.setRotate(90);
                matrix.postScale(-1, 1);
                mLog.i(TAG,"ORIENTATION_TRANSPOSE");
                break;
            case ExifInterface.ORIENTATION_ROTATE_90:
                matrix.setRotate(90);
                mLog.i(TAG,"ORIENTATION_ROTATE_90");
                break;
            case ExifInterface.ORIENTATION_TRANSVERSE:
                mLog.i(TAG,"ORIENTATION_TRANSVERSE");
                matrix.setRotate(-90);
                matrix.postScale(-1, 1);
                break;
            case ExifInterface.ORIENTATION_ROTATE_270:
                matrix.setRotate(-90);
                mLog.i(TAG,"ORIENTATION_ROTATE_270");
                break;

            default:
                mLog.i(TAG,"UNKNOWN");
                return bitmap;
        }
        try {
            Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
            bitmap.recycle();
            return bmRotated;
        } catch (OutOfMemoryError e) {
            e.printStackTrace();
            return null;
        }
    }

Хотя у меня былопроблемы на нескольких устройствах Samsung это работает хорошо. Попробуйте.

...