web-dev-qa-db-fra.com

puis-je obtenir la largeur et la hauteur du fichier image depuis uri dans android?

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!

33
jk jk
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

84
Blackbelt

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 ); 
10
simplatek

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;
9
Gazihan Alankus

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();
3
Oleh Sokolov

la solution est d'utiliser new File(uri.getPath()).getAbsolutePath() au lieu de uri.toString()

3
jk jk

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;
}
2
birdy

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};
}
0
Zain