Mettere una grande immagine in una ImageView non funziona

Penso che ci sia un problema con il mio ImageView.
ho creato una galleria, dove posso toccare un’immagine e metterla nel mio ImageView di seguito:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" 
android:layout_height="fill_parent"
android:background="@drawable/fonddegrade">

<Gallery android:layout_height="wrap_content" 
    android:id="@+id/gallery" 
    android:layout_width="fill_parent" />

<ImageView android:layout_below="@+id/gallery"
    android:layout_height="wrap_content" 
    android:id="@+id/laphoto" 
    android:layout_width="wrap_content" 
    android:layout_centerHorizontal="true"/>

Questo è perfettamente funzionante con piccola immagine, ma non con l’immagine grande (3264 * 1952). Quando mi tocca (così, cercando di mettere in ImageView), ho un errore e il mio appplication crash.
Ecco il mio codice java per visualizzare l’immagine:

        public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);
            this.requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.photo);

            File images; //Trouver le bon endroit de stockage
            if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()))
                images = new File("/sdcard/MyPerformance/Photo");
            else
                images = this.getFilesDir();

            images.mkdirs();
            File[] imagelist = images.listFiles(new FilenameFilter(){   
                @Override   
                public boolean accept(File dir, String name)   
                {   
                    return ((name.endsWith(".jpg"))||(name.endsWith(".png")));
                }
            });

            mFiles = new String[imagelist.length];
            for(int i = 0 ; i< imagelist.length; i++)   
            {   
                mFiles[i] = imagelist[i].getAbsolutePath();   
            }
            mUrls = new Uri[mFiles.length];
            for(int i = 0; i < mFiles.length; i++)   
            {   
                mUrls[i] = Uri.parse(mFiles[i]);      
            }

            imgView = (ImageView)findViewById(R.id.laphoto);
            if(mFiles.length != 0)
                imgView.setImageURI(mUrls[0]);

            gallery = (Gallery) findViewById(R.id.gallery);
            gallery.setAdapter(new ImageAdapter(this));

            gallery.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                    imgView.setImageURI(mUrls[position]);
                }
            });
    }

Sia il problema deriva dal setImageURI (ma non credo che questa sia la causa, dal momento che si tratta di lavoro con immagine piccola) o a causa delle dimensioni dell’immagine.

Quale soluzione mi potete dare per risolvere questo problema?
Hai il mio grazie.

PS: Perchè il mio “Ciao” sono sempre stato cancellato?

InformationsquelleAutor FR073N | 2011-11-20

 

3 Replies
  1. 8

    L’immagine è probabilmente troppo grande per Android e va in out of memory. Apps potrebbe avere come basso 16Mb di memoria utilizzabile. L’immagine prende 3264 * 1952 * 4 = ~25.5 Mb (larghezzaaltezzaargb). Quindi potrebbe essere migliore per ridimensionare le immagini in dimensione più piccola.

    Vedere: http://android-developers.blogspot.co.uk/2009/01/avoiding-memory-leaks.html

    Quindi: Strano out of memory problema durante il caricamento di un’immagine di un oggetto Bitmap

    Infine: VM in esecuzione di memoria durante il caricamento delle immagini da cache

    • Questo è esso! Il tuo link mi ha aiutato molto, il mio problema era lo stesso come il secondo link, e ho usato la stessa soluzione per sbarazzarsi di questo problema. Dobbiamo, dunque, scala troppo grande immagine per il buon lavoro.
    • Sono contento che ha funzionato 🙂 mi Sembrava un problema simile.
    • (Ricordate inoltre di accettare la risposta troppo)
  2. 1

    Ecco una bitmap[ util classe per aiutare con la gestione della bitmap di grandi dimensioni.

    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    
    public class BitmapUtils {
    
        public static int calculateInSampleSize(
                BitmapFactory.Options options, int reqWidth, int reqHeight) {
        //Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;
    
        if (height > reqHeight || width > reqWidth) {
    
            //Calculate ratios of height and width to requested height and width
            final int heightRatio = Math.round((float) height / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);
    
            //Choose the smallest ratio as inSampleSize value, this will guarantee
            //a final image with both dimensions larger than or equal to the
            //requested height and width.
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
    
        }
    
        return inSampleSize;
    }
    
    
        public static Bitmap decodeSampledBitmapFromResource(String pathToFile,
                    int reqWidth, int reqHeight) {
    
            //First decode with inJustDecodeBounds=true to check dimensions
            final BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(pathToFile, options);
    
            //Calculate inSampleSize
            options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
    
            //Decode bitmap with inSampleSize set
            options.inJustDecodeBounds = false;
            return BitmapFactory.decodeFile(pathToFile, options);
        }
    
    }
  3. 1

    Con Glide biblioteca:

    Glide.with(getContext())
         .load(selectedImageUri)
         .into(imageView);

    Glide fa tutto il backend di lavoro.

    • Mentre questo link può rispondere alla domanda, il collegamento solo risposte sono scoraggiati su Stack Overflow, si può migliorare questa risposta prendendo le parti vitali del link e metterlo nella vostra risposta, questo fa in modo che la tua risposta è ancora una risposta, se il link viene modificato o rimosso 🙂

Lascia un commento