43

MediaStore.Images.Media我可以正常通过图像宽度

但我需要从从 Dropbox 中选择的图像中获取图像的宽度和高度

所以目前我有以下方法从保管箱获取图像大小

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

但我真正需要的是获取文件的宽度和高度值

有人知道如何实现吗?请帮忙!

4

10 回答 10

111
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;
 
}

不,没有办法。您必须创建一个位图对象。如果您使用该inJustDecodeBounds标志位图将不会加载到内存中。实际上BitmapFactory.decodeFile会返回null。在我的示例uri中是图像的物理路径

于 2013-05-08T12:39:53.883 回答
22

如果您有文件 uri,Blackbelt 的答案是正确的。但是,如果您在官方相机教程中使用新的文件提供程序,它将无法正常工作。这适用于这种情况:

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;
于 2017-07-12T13:19:36.027 回答
15

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 ); 
于 2016-01-20T00:56:49.470 回答
5

组实用程序与 Android 中的 Size 抽象一起使用。

它包含一个类SizeFromImage.java 你可以像这样使用它:

ISize size = new SizeFromImage(imgFilePath);
size.width();
size.hight();
于 2018-03-02T10:00:39.153 回答
3

解决方案是使用new File(uri.getPath()).getAbsolutePath()而不是uri.toString()

于 2013-05-08T13:07:51.430 回答
2

除了@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;
}
于 2016-10-28T08:30:53.893 回答
2

请使用输入流:

public int[] getImageSize(Uri uri){
    try {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        InputStream input = this.getContentResolver().openInputStream(uri);
        BitmapFactory.decodeStream(input, null, options);  input.close();
        return new int[]{options.outWidth, options.outHeight};
    }
    catch (Exception e){}
    return new int[]{0,0};
}

它将以数组形式返回:

int[]{ width , height }
于 2020-08-16T09:37:10.640 回答
1

通过将 uri.getPath() 替换为 uri.getLastPathSegment(),接受的答案返回宽度/高度为 0,它返回正确的尺寸

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};
}
于 2019-09-01T05:41:36.260 回答
1

对于具有内容 uri(以 开头content://)的人,打开一个InputStream& 解码该流以避免获得 0 宽度和高度。我将使用 Kotlin

val uri: Uri = ....

val options = BitmapFactory.Options().apply { inJustDecodeBounds = true }
val inputStream = contentResolver.openInputStream(uri)
BitmapFactory.decodeStream(inputStream, null, options)

val width = options.outWidth
val height = options.outHeight
于 2020-07-27T13:52:54.473 回答
0

如果你们在宽度和高度上不断得到 (0,0),那么您可能想要解码一个流,而不是一个文件。

这可能是因为您试图从资产中读取图像。尝试这个:

val b = BitmapFactory.decodeStream(context.assets.open("path/in/assets/img.png"))
val width = b.width
val height = b.height
于 2020-12-01T15:59:32.450 回答