2017-01-02 3 views
1

Was ist die beste Vorgehensweise, um ein Bild zu imageView anzuzeigen? Wir haben zwei Arten von Bildern, eines ist bitmap und ein anderes ist URI. Wenn ich Bitmap,Unterschied zwischen URI und Bitmap-Bild

Bitmap photo = (Bitmap) data.getExtras().get("data"); 
imageView.setImageBitmap(photo); 

verwenden, ist das Bild ein wenig verschwommen.

Wenn ich URI verwende, bekomme ich manchmal Probleme mit dem Arbeitsspeicher.

URI imageUri = data.getData(); 
imageView.setImageURI(imageURI); 

Was ist der Unterschied zwischen den beiden?

enter image description here

Antwort

1

ImageView verfügt über 4 APIs zur Angabe des Bilds.

  1. setImageDrawable (Drawable ziehbar)
  2. setImageBitmap (Bitmap bm)
  3. setImageResource (int RESID)
  4. setImageURI (URI uri)

hier setImageDrawable ist die primitive Funktion andere APIs verlassen auf. Die anderen 3 sind nur Hilfsmethoden, die Sie weniger Code schreiben lassen.

setImageURI, setImageBitmap werden beide im UI-Thread ausgeführt. Ich würde sagen, setImageBitmap ist etwas schneller als die erste. setImageURI hängt wirklich davon ab, wo die Uri-Ressource herkommt (z. B. könnte die URI auf eine entfernte Datei verweisen, die nicht einmal auf dem Telefon gespeichert ist).

setImageURI() ist nicht besser, als Lesen und Decodieren auf dem UI-Thread zu verwenden, was einen Latenz-Schluckauf verursachen kann.

Besser folgendes zu verwenden: -

setImageDrawable(android.graphics.drawable.Drawable) oder setImageBitmap(android.graphics.Bitmap) und BitmapFactory statt.

können Sie auch bitmap von uri zurückzukehren und verwenden Sie es in imageview

Uri imageUri = intent.getData(); 
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),imageUri); 
Imageview my_img_view = (Imageview) findViewById (R.id.my_img_view); 
my_img_view.setImageBitmap(bitmap); 

auch irgendwann große Bitmap auf Imageview Laden kann der Speicher verursachen exception..so Sie Bitmap effizient laden sollte ..

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, 
    int reqWidth, int reqHeight) { 

    // First decode with inJustDecodeBounds=true to check dimensions 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeResource(res, resId, options); 

    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    return BitmapFactory.decodeResource(res, resId, options); 
} 

mImageView.setImageBitmap(
    decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100)); 

siehe diese Link auch ..zum besseren Verständnis

  1. Strange out of memory issue while loading an image to a Bitmap object

  2. Android Entwickler-Dokumentation: https://developer.android.com/training/displaying-bitmaps/load-bitmap.html

+0

Dank für die nützlichen Tipps! –

+0

Woher weiß ich, was der Wert für reqWidth und reqHeight ist, damit das Bild nicht verschwommen aussieht? –

1

Bitmap ist ein gebrauchsfertiges Bild (set of bytes with color data) und URI ist ein Weg, um etwas. URI kann /emulated/home/... sein, kann http://google.com und so weiter sein.