2016-07-20 4 views
0

Ich versuche, Bilder aus den Dateien des Telefons zu laden. Es geht gut, wenn die Datei ein kleines Bild ist:versuchen, Bild aus Dateien zu laden, einen schwarzen Kreis stattdessen

Ergebnis für 40kb Bild, 275x269

Aber wenn ich versuche, ein größeres Bild zu laden, dies geschieht:

Ergebnis für 2,63 MB Bild, 4160x2340

Mein Code - Holen Sie sich die Datei:

private void selectImage(){ 
    Intent i = new Intent(); 
    i.setType("image/*"); 
    i.setAction(Intent.ACTION_GET_CONTENT); 
    startActivityForResult(Intent.createChooser(i, "Select File"), SELECT_FILE); 
} 

Set Bild als Image der Hintergrund:

public void onActivityResult(int resultCode, Intent data){ 
    super.onActivityResult(resultCode, data); 
    if (resultCode == Activity.RESULT_OK) { 
      if(data!=null) { 
       try { 
        photo = MediaStore.Images.Media 
          .getBitmap(getApplicationContext().getContentResolver(), 
          data.getData()); 
       }catch(Exception e){ 
        e.printStackTrace(); 
       } 
      } 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      photo.compress(Bitmap.CompressFormat.PNG, 100, baos); 

      imageView.setImageBitmap(photo); 
     } 
    } 
} 

Dies ist, was die Android-Monitor zeigt mir:

07-20 17:32:57.949 3200-3200/rafael.couto.newmoka D/dalvikvm: GC_FOR_ALLOC freed 265K, 6% free 5668K/5972K, paused 4ms, total 6ms 
07-20 17:32:58.079 3200-3200/rafael.couto.newmoka I/dalvikvm-heap: Grow heap (frag case) to 42.701MB for 38937612-byte allocation 
07-20 17:32:58.079 3200-3208/rafael.couto.newmoka D/dalvikvm: GC_FOR_ALLOC freed 2K, 1% free 43691K/44000K, paused 5ms, total 5ms 
07-20 17:32:59.599 3200-3200/rafael.couto.newmoka D/dalvikvm: GC_FOR_ALLOC freed 2120K, 6% free 45599K/48036K, paused 4ms, total 4ms 
07-20 17:33:00.889 3200-3200/rafael.couto.newmoka D/dalvikvm: GC_FOR_ALLOC freed 2043K, 9% free 47650K/52132K, paused 4ms, total 4ms 
07-20 17:33:00.899 3200-3200/rafael.couto.newmoka I/dalvikvm-heap: Grow heap (frag case) to 54.569MB for 8392804-byte allocation 
07-20 17:33:00.909 3200-3208/rafael.couto.newmoka D/dalvikvm: GC_FOR_ALLOC freed 0K, 8% free 55846K/60332K, paused 4ms, total 4ms 
07-20 17:33:03.209 3200-3200/rafael.couto.newmoka D/dalvikvm: GC_FOR_ALLOC freed 4094K, 15% free 51752K/60332K, paused 3ms, total 3ms 
07-20 17:33:03.239 3200-3200/rafael.couto.newmoka I/dalvikvm-heap: Grow heap (frag case) to 66.586MB for 16793700-byte allocation 
07-20 17:33:03.249 3200-3208/rafael.couto.newmoka D/dalvikvm: GC_FOR_ALLOC freed 0K, 12% free 68152K/76736K, paused 8ms, total 8ms 
07-20 17:33:03.589 3200-3200/rafael.couto.newmoka D/dalvikvm: GC_FOR_ALLOC freed 8200K, 22% free 59952K/76736K, paused 2ms, total 2ms 
07-20 17:33:03.589 3200-3200/rafael.couto.newmoka I/dalvikvm-heap: Grow heap (frag case) to 67.363MB for 9210496-byte allocation 
07-20 17:33:03.599 3200-3208/rafael.couto.newmoka D/dalvikvm: GC_FOR_ALLOC freed 156K, 11% free 68790K/76736K, paused 7ms, total 7ms 

Was ist los, und was soll ich tun?

+1

was ist los, Ihr Bild ist zu groß und es wird nicht laden aufgrund von Speicherproblemen und eher. Passen Sie die Größe des Bilds an die Größe Ihrer Ansicht an. – petey

+0

Was ist der beste Weg dafür? –

+0

wurde die Größe eines Bildes geändert und wurde ein paar Mal nach dem Android-Tag gefragt. – petey

Antwort

1

Sie haben das Problem in Ihrer Frage so gut wie identifiziert - das Problem besteht darin, ein Bild mit sehr hoher Auflösung zu verwenden, das viel Speicherplatz belegt. Sie müssen die Bildauflösung auf die Größe, die Sie tatsächlich benötigen, abtasten - aber es sieht so aus, als ob Sie bereits ein kleineres Bild zur Hand haben. Wenn Sie Bilder verkleinern möchten, sehen Sie sich https://developer.android.com/training/displaying-bitmaps/load-bitmap.html an.

0

(Veröffentlicht im Namen des OP).

Problem gelöst, dank petey und ucsunil. Ich habe dies getan, um große Bilder zu verhindern:

public void onActivityResult(int resultCode, Intent data){ 
    super.onActivityResult(resultCode, data); 
    if (resultCode == Activity.RESULT_OK) { 
     if(data!=null) { 
      try { 
       photo = MediaStore.Images.Media 
          .getBitmap(getApplicationContext().getContentResolver(), 
            data.getData()); 

        int width = bigPhoto.getWidth(); 
        int height = bigPhoto.getHeight(); 

        while(width>=500 || height>=500){ 
         photo = Bitmap.createScaledBitmap(bigPhoto, (int)(width*0.4), (int)(height*0.4), true); 
         width = photo.getWidth(); 
         height = photo.getHeight(); 
        } 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
     } 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     photo.compress(Bitmap.CompressFormat.PNG, 100, baos); 

     imageView.setImageBitmap(photo); 
    } 
}