Установить ориентацию изображения с помощью ExifInterface

setRotation method в Camera.Parameters не работает на всех устройствах. Кто-то предлагает вручную изменить EXIF информация для решения проблемы. Можете ли вы дать мне краткий пример того, как установить exif информация с ExifInterface таким образом установить ориентацию изображения как портрет?

private int savePicture(byte[] data)
{
       File pictureFile = getOutputMediaFile();
       if (pictureFile == null)
           return FILE_CREATION_ERROR;

       try {
           FileOutputStream fos = new FileOutputStream(pictureFile);
           fos.write(data);
           fos.close();
       } catch (FileNotFoundException e) {
           return FILE_NOT_FOUND;
       } catch (IOException e) {
           return ACCESSING_FILE_ERROR;
       }

   return OKAY;
}

Я пытался с этим:

    try {
        ExifInterface exifi = new ExifInterface(pictureFile.getAbsolutePath());
        exifi.setAttribute(ExifInterface.TAG_ORIENTATION, String.valueOf(ExifInterface.ORIENTATION_ROTATE_90));
        exifi.saveAttributes();
    } catch (IOException e) {
        Log.e(TAG, "Exif error");
    }

но ничего не меняется, когда я визуализирую картинки из галереи Android.

4 ответа

Для тех, кто действительно хочет записать эту EXIF-информацию, вот код:

ExifInterface exifInterface = new ExifInterface(someFile.getPath());
exifInterface.setAttribute(ExifInterface.TAG_ORIENTATION,
                           String.valueOf(orientation));
exifInterface.saveAttributes();

в то время как orientation является одной из стандартных ориентаций, т.е. ExifInterface.ORIENTATION_ROTATE_{90,180,270},

Если ориентация сохраняется в файле, но не отображается в галерее, это может быть связано с кэшированием ориентации в MediaStore. Таким образом, вы должны попытаться обновить эту информацию там же.

Вот фрагмент кода (непроверенный)

/**
 * @param fileUri the media store file uri
 * @param orientation in degrees 0, 90, 180, 270
 * @param context
 * @return
 */
public boolean setOrientation(Uri fileUri, int orientation, Context context) {
    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.ORIENTATION, orientation);
    int rowsUpdated = context.getContentResolver().update(fileUri, values, null, null);
    return rowsUpdated > 0;
}

/**
 * Get content uri for the file path
 * 
 * @param path
 * @param context
 * @return
 */
public Uri getContentUriForFilePath(String path, Context context) {
    String[] projection = {
        MediaStore.Images.Media._ID
    };
    Cursor cursor = context.getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection,
            MediaStore.Images.Media.DATA + " = ?", new String[] {
                path
            }, null);
    Uri result = null;
    if (cursor != null) {
        try {
            if (cursor.moveToNext()) {
                long mediaId = cursor.getLong(0);
                result = ContentUris.withAppendedId(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, mediaId);
            }
        } finally {
            cursor.close();
        }
    }
    return result;
}

его код ниже работает для меня..

Файл imageFile = новый файл (string_path); //добавляем сюда путь

              ExifInterface exif = null;

        try {

            exif = new ExifInterface(imageFile.getAbsolutePath());

        } catch (IOException e) {

            e.printStackTrace();

        }

        int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

        int rotate = 0;

        switch (orientation) {

            case ORIENTATION_ROTATE_270:
                rotate = 270;
                break;

            case ORIENTATION_ROTATE_180:
                rotate = 180;
                break;

            case ORIENTATION_ROTATE_90:
                rotate = 90;
                break;

        }

        Matrix matrix = new Matrix();

        matrix.postRotate(rotate);

        this.btmap = Bitmap.createBitmap(this.btmap, 0, 0, this.btmap.getWidth(), this.btmap.getHeight(), matrix, true);

        Glide.with(this).load(this.btmap).into((ImageView) getActivity().findViewById(R.id.btnimg));

Ну, я застрял в такой проблеме, и попробовал решение, над которым вы работаете, и в итоге использовал функцию Matrix.

Независимо от того, какие изображения я делал, все было в альбомной ориентации, поэтому в приложении я просто применил приведенный ниже код, и он работал хорошо:-

Matrix matrix = new Matrix();
//set image rotation value to 90 degrees in matrix.
matrix.postRotate(90);
//supply the original width and height, if you don't want to change the height and width of //bitmap.
Bitmap bMapRotate = Bitmap.createBitmap(bMap, 0, 0, newWidth, newHeight, matrix, true);
Другие вопросы по тегам