Изображения, сохраненные из предварительного просмотра камеры в альбомной ориентации - PullRequest
0 голосов
/ 02 февраля 2019

Я работаю над своим первым приложением для Android.Он использует предварительный просмотр камеры из API camera1 (я знаю, что он устарел, но я не могу найти простые для понимания ресурсы для camera2).

Приложение намного сложнее и выше моего уровня, так как API камеры не работает.не прост в использовании.Но я в основном там.

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

Вот код, который я сейчас использую.

public static File getPictureFile(int mediaType) {

    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Camera App");
    if (!mediaStorageDir.exists()) {
        if (!mediaStorageDir.mkdirs()) {
            Log.d("Camera App", "Failed to create directory");
            return null;
        }
    }
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;

    if (mediaType == MEDIA_TYPE_IMAGE) {
        mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
    } else {
        return null;
    }

    return mediaFile;
}

public void takePicturePreview() {
    Camera.PictureCallback mPicture = new Camera.PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            File pictureFile = getPictureFile(MEDIA_TYPE_IMAGE);
            if (pictureFile ==null) {
                Log.d(TAG, "Error creating media file, check storage permissions");
                return;
            }

            //ROTATION NEEDS TO OCCUR HERE
            //String filePath = pictureFile.getPath();
            //Bitmap bitmap = BitmapFactory.decodeFile(filePath);


            /*ExifInterface exif = null;
            try {
                exif = new ExifInterface(filePath);
            } catch (IOException e) {
                e.printStackTrace();
            }*/

            //int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
            //Matrix matrix = new Matrix();
            //matrix.postRotate(orientation);

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

            try {
                FileOutputStream fos = new FileOutputStream(pictureFile);
                //bitmap.compress(Bitmap.CompressFormat.JPEG,85,fos);
                fos.write(data);
                fos.close();
            } catch (FileNotFoundException e) {
                Log.d(TAG, "File not found: " + e.getMessage());
            } catch (IOException e) {
                Log.d(TAG, "Error accessing file: " + e.getMessage());
            }
        }
    };



    mCamera.takePicture(null, null, mPicture);

}

Все в комментариях - это тестовый код, которыйЯ пытался использовать, но ничего не работает.Поэтому я попытался использовать BitmapFactory, Exifinterface, чтобы получить ориентацию, затем матрицу, чтобы повернуть ее, а затем создать и сохранить растровое изображение, но оно просто вылетает.

На данный момент целые выражения, растровые изображения настолько неясны дляМне действительно трудно понять, что происходит.

Может кто-нибудь дать какие-нибудь советы или помочь разрешить моему приложению сохранять фотографии в правильной ориентации?

1 Ответ

0 голосов
/ 05 февраля 2019

Если используется старый API камеры, вам необходимо вызвать Parameters.setRotation и Camera.setParameters () перед вызовом Camera.takePicture ().

В документации приведен пример кода для определения текущей ориентации устройства.

...