web-dev-qa-db-ja.com

AndroidのURIから画像ファイルの幅と高さを取得できますか?

私はMediaStore.Images.Mediaを介して通常画像の幅を取得できます

しかし、私はドロップボックスから選択した画像から画像の幅と高さを取得する必要があります

だから現在、私はDropboxから画像サイズを取得する次の方法を持っています

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

しかし、実際に必要なのはファイルの幅と高さの値を取得することです

誰もがそれを達成する方法を知っていますか?助けてください!

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;

}

方法はありません。 Bitmapオブジェクトを作成する必要があります。 inJustDecodeBoundsフラグを使用すると、ビットマップはmomeryにロードされません。実際には BitmapFactory.decodeFileはnullを返します。私の例では、uriは画像への物理的なパスです

84
Blackbelt

Blackbeltの答えはほとんどの場合Optionsを使用して機能しますが、ExifInterfaceを使用して別のソリューションまたはフォールバックソリューションを提案したいと思います。画像URIがある場合は、フルパスを使用してExifInterfaceを作成できます。ビットマップオブジェクトもBitmapFactory.Options

例.

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

ファイル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;
9
Gazihan Alankus

この ユーティリティのセット Androidのサイズ抽象化で動作します。

クラスが含まれています SizeFromImage.Java 次のように使用できます:

ISize size = new SizeFromImage(imgFilePath);
size.width();
size.hight();
3
Oleh Sokolov

解決策は、new File(uri.getPath()).getAbsolutePath()の代わりにuri.toString()を使用することです

3
jk jk

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

受け入れられた答えは、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};
}
0
Zain