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

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

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

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

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

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

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

 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 – это физический путь к изображению

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

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

ех.

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

В дополнение к ответу @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; } 

Ответ 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;