2013-05-08 19 views
22

mogę się szerokość obrazu przez MediaStore.Images.Media zazwyczajCzy mogę uzyskać szerokość i wysokość pliku obrazu z URI w Androidzie?

ale trzeba się szerokość i wysokość od obrazu, który jest wybrany ze skrzynki

tak Obecnie mają następujący sposób do uzyskania wielkości obrazu ze skrzynki

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

ale to, co rzeczywiście trzeba otrzymujesz szerokość pliku i wartość wysokości

ktoś wie jak to osiągnąć? proszę o pomoc!

Odpowiedz

67
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; 

} 

nie ma mowy. Musisz utworzyć obiekt Bitmap. jeśli użyjesz flagi inJustDecodeBounds, mapa bitowa nie zostanie załadowana do macierzy. W rzeczywistości BitmapFactory.decodeFile zwróci wartość null. W moim przykładzie uri jest fizyczna ścieżka do obrazu

+5

+1 miłe odpowiedzi. –

+0

spowoduje to oom fc? nie ma potrzeby ustawiania wartości null/recycling po uzyskaniu szerokości i wysokości? –

+0

nie. Ponieważ bitmapa nie zostanie załadowana do pamięci, nie spowoduje to ani OOM, ani jej recykling. – Blackbelt

3

rozwiązaniem jest użyć new File(uri.getPath()).getAbsolutePath() zamiast uri.toString()

+0

Dziękuję.Zapisz mój czas – hasanghaforian

+1

To nie jest rozwiązanie, ponieważ Uris może nie być w rzeczywistości plikami. –

4

odpowiedź blackbelt będzie pracować przez większość czasu przy użyciu opcji, ale chciałbym zaproponować inne rozwiązanie lub rozwiązania zastępczego przez używając ExifInterface. Jeśli masz identyfikator URI obrazu, możesz utworzyć ExifInterface za pomocą fullpath, bez potrzeby obiektu Bitmap ani BitmapFactory.Options.

np.

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

Oprócz @Blackbelt odpowiedź należy użyć następującego kodu, aby pobrać ścieżkę od 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; 
} 
1

blackbelt odpowiedź jest poprawna, jeśli masz URI pliku. Jednakże, jeśli korzystasz z nowych dostawców plików, jak w official camera tutorial, nie będzie działać. Działa to w tym przypadku:

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

to set of utilities pracować z abstrakcji Rozmiar w Androidzie.

Zawiera klasę SizeFromImage.java Można go używać tak:

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