如何编辑我的图像EXIF数据进行图像旋转

问题描述 投票:0回答:1

在我的应用中,用户从相机或图库中获取图像,然后将这些图像转换为PDF。现在,我的问题是在某些设备上,相机捕获的图像旋转了90度,这些设备是一些三星设备,特别是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();
android android-camera
1个回答
1
投票

将此添加到构建gradle:

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;
        }
    }

尽管我在一些三星设备上遇到了问题,但效果很好。试试看。

© www.soinside.com 2019 - 2024. All rights reserved.