Bitmap-Out-Of-Memory-Probleme

Mein Problem

Ich ein Bild mit meinem android-Gerät. Ich habe dann decodieren, Bild aus Datei.

        Bitmap photo = BitmapFactory.decodeFile(EXTERNAL_IMAGE_PATH+File.separator+this._currentPhotoName+JPEG_FILE_SUFFIX);
        if (photo == null && data != null) 
            photo = (Bitmap) data.getExtras().get("data");
        else if (data == null && photo == null)
            Log.e("CCPhotoManager","Can't find image from file or from intent data.");

Ich dann überprüfen, dass Bild und sehen, ob es gedreht werden muss, um die richtige Orientierung.

             try {
                ExifInterface exif = new ExifInterface(EXTERNAL_IMAGE_PATH+File.separator+this._currentPhotoName+JPEG_FILE_SUFFIX);
                int rotation = CCDataUtils.exifToDegrees(exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL));
                Log.v("CCPhotoManager", "Rotation:"+rotation);
                if (rotation > 0) {
                    photo = this.convertSavedImageToCorrectOrientation(EXTERNAL_IMAGE_PATH+File.separator+this._currentPhotoName+JPEG_FILE_SUFFIX, photo, rotation);
                }
            } catch (IOException e1) {
                //TODO Auto-generated catch block
                e1.printStackTrace();
            }

Wenn Sie es brauchen, das rotierende nenne ich diese Methode.

public Bitmap convertSavedImageToCorrectOrientation(String filePath,Bitmap photo,int rotation) {
        Log.d("CCPhotoManager", "Changing Orientation of photo located at: "+filePath+" Rotating by:"+rotation);
        int width = photo.getWidth();
        int height = photo.getHeight();


        Matrix matrix = new Matrix();
        matrix.preRotate(rotation);

        Bitmap adjusted = Bitmap.createBitmap(photo, 0, 0, width, height, matrix, true);

        try {
               FileOutputStream out = new FileOutputStream(filePath);
               adjusted.compress(Bitmap.CompressFormat.JPEG, 100, out);
        } catch (Exception e) {
               e.printStackTrace();
        }

        return adjusted;
    }

Ich bin immer Out of Memory Beschwerden, wenn die convertSavedImageToCorrectOrientation heißt auf der Linie Bitmap adjusted = Bitmap.createBitmap(photo,0,0,width,height,matrix,true);

Dies ist nur der Fall auf der Samsung Galaxy S3. Es funktioniert gut auf den Samsung Galaxy Ace, HTC Hero und die Sony Xperia U.

Hier ist der Fehler.

10-17 14:33:33.950: E/AndroidRuntime(12556): java.lang.OutOfMemoryError
10-17 14:33:33.950: E/AndroidRuntime(12556):    at android.graphics.Bitmap.nativeCreate(Native Method)
10-17 14:33:33.950: E/AndroidRuntime(12556):    at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
10-17 14:33:33.950: E/AndroidRuntime(12556):    at android.graphics.Bitmap.createBitmap(Bitmap.java:551)

Es ist eine riesige Menge an Speicher zu.

10-17 14:33:33.945: E/dalvikvm-heap(12556): Out of memory on a 31961104-byte allocation.

Ich denke, Ihr etwas zu tun mit der Menge an Bitmaps Rum, aber ich bin mir nicht sicher, wie Sie Sie zu stoppen, dieser Fehler passiert.

Ich weiß, Sie können rufen Sie .recycle(); auf Sie, aber es scheint nicht zu funktionieren.

Meine Frage

Wie kann ich richtig mit meinem Bitmaps, damit ich nicht über das OOM-problem?

Vielen Dank im Voraus

Dies ist eine ziemlich Häufig gestellte Frage mit vielen Duplikate. Die meisten von Ihnen sind spezifisch für jede situation die Entwickler sich in die enge getrieben, aber die Chancen sind, konnte man irgendwo Lesen, was Techniken wurden vorgeschlagen, um Sie in Ordnung zu halten bitmap-Größe nach unten.
Sie benötigen zum Lesen, ändern und speichern das gesamte Bild? Keine sample-size? Vielleicht passiert auf dem S3 weil es hat eine bessere Kamera, und deshalb laden Sie ein größeres Bild auf den Speicher.
Muss ich drehen das gesamte Bild in die korrekte Ausrichtung, und speichern Sie es wieder, weil die Kamera speichert immer es in Ihre Standard-Orientierung, ist nicht immer richtig. Ich bin mir ziemlich sicher, die Größe des Bildes aufgrund der besseren Kamera ist der Grund, wie Sie sagte
ok, die Kamera speichert das so vereinbart, aber dann, wenn Sie verwenden müssen, dass das Bild auf einer app haben Sie immer die EXIF-Daten richtig angezeigt auf Ihrem app... kleiner natürlich.
Das ist ein guter Vorschlag und eine gute alternative. Das Problem habe ich mit dieser Methode ist es, wenn ich die eigentliche Datei in der richtigen Ausrichtung, dh. Anhängen an eine E-Mail?

InformationsquelleAutor StuStirling | 2012-10-17

Schreibe einen Kommentar