私はMediaStore.Images.Media
を介して通常画像の幅を取得できます
しかし、私はドロップボックスから選択した画像から画像の幅と高さを取得する必要があります
だから現在、私はDropboxから画像サイズを取得する次の方法を持っています
private void getDropboxIMGSize(Uri uri){
String size = Long.toString(new File(uri.getPath()).length());
return size;
}
しかし、実際に必要なのはファイルの幅と高さの値を取得することです
誰もがそれを達成する方法を知っていますか?助けてください!
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
は画像への物理的なパスです
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 );
ファイル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;
この ユーティリティのセット Androidのサイズ抽象化で動作します。
クラスが含まれています SizeFromImage.Java 次のように使用できます:
ISize size = new SizeFromImage(imgFilePath);
size.width();
size.hight();
解決策は、new File(uri.getPath()).getAbsolutePath()
の代わりにuri.toString()
を使用することです
@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;
}
受け入れられた答えは、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};
}