je peux obtenir la largeur de l'image à travers MediaStore.Images.Media
normalement
mais j'ai besoin d'obtenir la largeur et la hauteur de l'image à partir de l'image sélectionnée dans la boîte de dépôt
donc actuellement j'ai la méthode suivante pour obtenir la taille de l'image à partir de dropbox
private void getDropboxIMGSize(Uri uri){
String size = Long.toString(new File(uri.getPath()).length());
return size;
}
mais ce dont j'ai réellement besoin, c'est d'obtenir la valeur de la largeur et de la hauteur du fichier
quelqu'un sait comment y parvenir? S'il vous plaît, aidez-moi!
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;
}
non il n'y a aucun moyen. Vous devez créer un objet Bitmap. si vous utilisez le drapeau inJustDecodeBounds
, le bitmap ne sera pas chargé dans momery. En réalité BitmapFactory.decodeFile
renverra null. Dans mon exemple, uri
est le chemin physique vers l'image
La réponse de Blackbelt fonctionnera la plupart du temps en utilisant Options
, mais je voudrais proposer une autre solution ou solution de secours en utilisant ExifInterface
. Si vous avez l'URI de l'image, vous pouvez créer le ExifInterface
en utilisant le chemin complet, pas besoin d'objet Bitmap ni BitmapFactory.Options
.
ex.
int width = exif.getAttributeInt( ExifInterface.TAG_IMAGE_WIDTH, defaultValue );
int height = exif.getAttributeInt( ExifInterface.TAG_IMAGE_LENGTH, defaultValue );
La réponse de Blackbelt est correcte si vous avez un uri de fichier. Cependant, si vous utilisez les nouveaux fournisseurs de fichiers comme dans le tutoriel officiel de l'appareil photo , cela ne fonctionnera pas. Cela fonctionne pour ce cas:
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;
Cette ensemble d'utilitaires pour fonctionner avec l'abstraction Size dans Android.
Il contient une classe SizeFromImage.Java Vous pouvez l'utiliser comme ceci:
ISize size = new SizeFromImage(imgFilePath);
size.width();
size.hight();
la solution est d'utiliser new File(uri.getPath()).getAbsolutePath()
au lieu de uri.toString()
En plus de la réponse @Blackbelt, vous devez utiliser le code suivant pour récupérer le chemin du fichier depuis 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;
}
La réponse acceptée renvoie avec moi un 0 de largeur/hauteur, en remplaçant uri.getPath () par uri.getLastPathSegment (), elle renvoie les dimensions correctes
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};
}