Могу ли я получить ширину и высоту файла изображения из uri в android?
Я могу получить ширину изображения через MediaStore.Images.Media
обычно
но мне нужно получить ширину и высоту изображения из изображения, которое выбрано из dropbox
так что в настоящее время у меня есть следующий метод получения размера изображения из dropbox
private void getDropboxIMGSize(Uri uri){
String size = Long.toString(new File(uri.getPath()).length());
return size;
}
но мне действительно нужно получить значение ширины и высоты файла
Кто-нибудь знает, как это достичь? Пожалуйста, помогите!
Ответы
Ответ 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};
}