Как остановить поворот изображения с помощью BitmapFactory после того, как камера сделает снимок? - PullRequest
0 голосов
/ 09 июля 2020

Когда я сделал снимок камерой на своем Pixel 3XL, он поворачивается на 90 градусов при отображении на следующей странице (в данном случае EditorActivity.class)

Я попытался исправить это, просто добавив метод flipIMage, но он, похоже, ничего не делает ...

 if(resultCode == RESULT_OK){
    
                        bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getPath()+ "/photoTemp.png");
                        flipIMage(bitmap);
                        Intent intent = new Intent(this, EditorActivity.class);
                        startActivity(intent);
                    }

flipIMage is;

public static Bitmap flipIMage(Bitmap bitmap) {
        Matrix matrix = new Matrix();
        int rotation = fixOrientation(bitmap);
        matrix.postRotate(rotation);
        matrix.preScale(-1, 1);
        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
    }

Если это помогает, мой метод cameraClicked здесь;

public void cameraClicked(View view) {


        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        File tempFile = new File(Environment.getExternalStorageDirectory().getPath()+ "/photoTemp.png");
        try {
            tempFile.createNewFile();
            Uri uri = FileProvider.getUriForFile(
                    this,
                    this.getApplicationContext()
                            .getPackageName() + ".provider", tempFile);
            //install.setDataAndType(uri, mimeType);
            takePictureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
            startActivityForResult(takePictureIntent, 2);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

fixOrientation метод;

private static int fixOrientation(Bitmap bitmap) {
        if (bitmap.getWidth() > bitmap.getHeight()) {
            return 90;
        }
        return 0;
    }

EditorActivity;

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        

            //
        
        setContentView(R.layout.activity_editor);
        
        Bitmap bitmap = MainActivity.bitmap;
        
        //
        
        
        
        
        
        btnDoneOrEdit = (Button) findViewById(R.id.btnDoneOrEdit);
        btnChangeMask = (Button) findViewById(R.id.btnChangeMask);
        
        editorImage = (EditorImage)findViewById(R.id.editorImage);
        editorImage.setBitmapImage(bitmap);
        editorImage.setTopPanel((LinearLayout) findViewById(R.id.topPanel));
        editorImage.setBottomPanel((LinearLayout) findViewById(R.id.bottomPanel));
        gridview_zombie = (GridView)findViewById(R.id.gridView_zombie);
        linearcontent = (LinearLayout)findViewById(R.id.linearlayout_content);

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Когда вы перезагружаете изображение на editor.class, вы можете попробовать проверить данные EXIF ​​на изображении и повернуть изображение перед отображением.

Чтобы получить путь из растрового изображения, используйте:

public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
    return Uri.parse(path);
}

public String getRealPathFromURI(Uri uri) {
    Cursor cursor = getContentResolver().query(uri, null, null, null, null); 
    cursor.moveToFirst(); 
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
    return cursor.getString(idx); 
}

     public static Bitmap rotateImage(Bitmap bitmap, String path) throws IOException {
        int rotate = 0;
        ExifInterface exif;
        exif = new ExifInterface(path);
        int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                ExifInterface.ORIENTATION_NORMAL);
        switch (orientation) {
            case ExifInterface.ORIENTATION_ROTATE_270:
                rotate = 270;
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                rotate = 180;
                break;
            case ExifInterface.ORIENTATION_ROTATE_90:
                rotate = 90;
                break;
        }
        Matrix matrix = new Matrix();
        matrix.postRotate(rotate);
        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
                bitmap.getHeight(), matrix, true);
    }

Затем вы можете использовать возвращенное растровое изображение и отобразить его.

Таким образом, ваш стек вызовов будет

  Uri uri = getimageUri(this, MainActivity.Bitmap);
  String path = getRealPathFromUri(uri);
  Bitmap rotatedBitmap = rotateImage(MainActivity.Bitmap, path);
  editorImage.setBitmapImage(bitmap);
0 голосов
/ 10 июля 2020

Попробуйте это

           //check the rotation of the image and display it properly
            ExifInterface exif;
            try {
                exif = new ExifInterface(filePath);

                int orientation = exif.getAttributeInt(
                        ExifInterface.TAG_ORIENTATION, 0);
                Log.d("EXIF", "Exif: " + orientation);
                Matrix matrix = new Matrix();
                if (orientation == 6) {
                    matrix.postRotate(90);
                    Log.d("EXIF", "Exif: " + orientation);
                } else if (orientation == 3) {
                    matrix.postRotate(180);
                    Log.d("EXIF", "Exif: " + orientation);
                } else if (orientation == 8) {
                    matrix.postRotate(270);
                    Log.d("EXIF", "Exif: " + orientation);
                }
                scaledBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0,
                        scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix,
                        true);
            } catch (IOException e) {
                e.printStackTrace();
            }

Используйте scaledBitmap для дальнейшей обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...