Подтвердить что ты не робот

Могу ли я получить ширину и высоту файла изображения из uri в android?

Я могу получить ширину изображения через MediaStore.Images.Media обычно

но мне нужно получить ширину и высоту изображения из изображения, которое выбрано из dropbox

так что в настоящее время у меня есть следующий метод получения размера изображения из dropbox

private void getDropboxIMGSize(Uri uri){
    String size = Long.toString(new File(uri.getPath()).length());
    return size;
}

но мне действительно нужно получить значение ширины и высоты файла

Кто-нибудь знает, как это достичь? Пожалуйста, помогите!

4b9b3361

Ответ 1

private void getDropboxIMGSize(Uri uri){
   BitmapFactory.Options options = new BitmapFactory.Options();
   options.inJustDecodeBounds = true;
   BitmapFactory.decodeFile(new File(uri.getPath()).getAbsolutePath(), options);
   int imageHeight = options.outHeight;
   int imageWidth = options.outWidth;

}

нет, нет способа. Вам нужно создать объект Bitmap. если вы используете флаг inJustDecodeBounds, растровое изображение не будет загружено в режиме momery. Фактически BitmapFactory.decodeFile вернет значение null. В моем примере uri есть физический путь к изображению

Ответ 2

Ответ Blackbelt будет работать большую часть времени с использованием Options, но я хотел бы предложить другое решение или альтернативное решение с использованием ExifInterface. Если у вас есть URI изображения, вы можете создать ExifInterface используя полный путь, без необходимости ни для объекта Bitmap, ни для BitmapFactory.Options.

ех.

int width = exif.getAttributeInt( ExifInterface.TAG_IMAGE_WIDTH, defaultValue );
int height = exif.getAttributeInt( ExifInterface.TAG_IMAGE_LENGTH, defaultValue ); 

Ответ 3

Blackbelt ответ правильный, если у вас есть файл URI. Однако, если вы используете новых провайдеров файлов, как в официальном руководстве по работе с камерой, это не сработает. Это работает для этого случая:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(
        getContext().getContentResolver().openInputStream(mPhotoUri),
        null,
        options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;

Ответ 4

решение использует new File(uri.getPath()).getAbsolutePath() вместо uri.toString()

Ответ 5

Это набор утилит для работы с абстракцией размера в Android.

Он содержит класс SizeFromImage.java. Вы можете использовать его следующим образом:

ISize size = new SizeFromImage(imgFilePath);
size.width();
size.hight();

Ответ 6

В дополнение к ответу @Blackbelt вы должны использовать следующий код для извлечения пути к файлу из Uri:

public static String getPathFromURI(Context context, Uri contentUri) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT &&
            DocumentsContract.isDocumentUri(context, contentUri)) {
        return getPathForV19AndUp(context, contentUri);
    } else {
        return getPathForPreV19(context, contentUri);
    }
}

private static String getPathForPreV19(Context context, Uri contentUri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = context.getContentResolver().query(contentUri, projection, null, null, null);
    if (cursor != null && cursor.moveToFirst()) {
        try {
            int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            return cursor.getString(columnIndex);
        } finally {
            cursor.close();
        }
    }

    return null;
}

@TargetApi(Build.VERSION_CODES.KITKAT)
private static String getPathForV19AndUp(Context context, Uri contentUri) {
    String documentId = DocumentsContract.getDocumentId(contentUri);
    String id = documentId.split(":")[1];

    String[] column = { MediaStore.Images.Media.DATA };
    String sel = MediaStore.Images.Media._ID + "=?";
    Cursor cursor = context.getContentResolver().
            query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    column, sel, new String[]{ id }, null);

    if (cursor != null) {
        try {
            int columnIndex = cursor.getColumnIndex(column[0]);
            if (cursor.moveToFirst()) {
                return cursor.getString(columnIndex);
            }
        } finally {
            cursor.close();
        }
    }

    return null;
}

Ответ 7

Принятый ответ возвращает мне 0 ширины/высоты, заменяя uri.getPath() на uri.getLastPathSegment(), он возвращает правильные размеры

public static int[] getImageDimension(Uri uri){
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(new File(uri.getLastPathSegment()).getAbsolutePath(), options);
    return new int[]{options.outWidth, options.outHeight};
}