2017-10-13 3 views
-1

Ziel: Ich möchte die aufgenommene Datei an den Server senden, in Code kann ich photoFile an den Server mit Retrofit senden, aber das Bild wird auf der Serverseite gedreht, so ist mein Ziel zu beobachten Drehen, zurück in den echten Zustand drehen und diese Datei an den Server senden.OutOfMemoryError Fehler beim Drehen einer Bitmap

Ausgabe: Ich nehme ein Bild von Cam und dann seine Drehung und basierend darauf versuche ich, es zurück zu drehen, aber es gibt nicht genügend Speicherfehler beim Erstellen von zweiten gedrehten Bitmap.

Frage: Ich bin auf der Suche nach einer Lösung, wo ich drehen und es an den Server senden kann, ohne Bitmap zu erstellen, wenn nicht, outofmemory Fehler zu vermeiden und korrekt gedrehte Datei zum Server zu senden.

 else if (requestCode == CAPTURE_IMAGE) { 
      ExifInterface exifInterface = new ExifInterface(photoFile.getAbsolutePath()); 
      Bitmap bitmapOrg = BitmapFactory.decodeFile(photoFile.getAbsolutePath(), new BitmapFactory.Options()); 
      Matrix matrix = new Matrix(); 

      //getRotation method rightly gives 90 as rotation. 
      matrix.postRotate(getRotation(exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, 
            ExifInterface.ORIENTATION_NORMAL))); 

      //point of outofmemory error while creating this bitmap 
      Bitmap rotated = Bitmap.createBitmap(bitmapOrg, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
      Log.d(TAG, "onActivityResult: "); 
     } 
+0

Sie brauchen nicht eine Bitmap zu erstellen. Sie legen die richtige Drehung in der Datei mit ExifInterface fest. Lesen Sie den Exif ein. Stellen Sie die Rotation wie gewünscht ein. Schreiben Sie exif zurück. – greenapps

Antwort

1

es gibt Speicherfehler aus, während der zweite Bitmap gedreht Erstellen

Sie können nicht frei System-RAM haben in einem einzigen vollen Auflösung Foto zu laden, geschweige denn zwei von ihnen. Ihre primären Optionen sind:

  • Laden Sie kein Foto mit voller Auflösung. Wählen Sie stattdessen eine kleinere Auflösung mit BitmapFactory.Options und inSampleSize, damit Android das Bild beim Laden verkleinert. Dies garantiert nicht, dass es funktioniert, da Ihr Heap möglicherweise eher fragmentiert ist, aber die Wahrscheinlichkeit erhöht, dass es funktioniert.

  • Sie die Drehung auf dem Server, in dem Sie viel RAM, viel CPU-Zeit, etc. haben

  • die Fotos laden und tun, die Drehung in C/C++ Code, das Android NDK mit, wie Native Zuordnungen (z. B. malloc()) zählen nicht zu Ihrem Heap-Limit.

  • Verwenden Sie android:largeHeap="true" im Manifest für Ihre <application>. Auf einigen Geräten erhalten Sie dadurch einen größeren Heap, mit dem Sie arbeiten können. Es gibt keine Garantie, dass Sie einen größeren Heap erhalten, und selbst mit dem größeren Heap haben Sie möglicherweise noch nicht genügend Arbeitsspeicher.

Ich suche Lösung, wo ich drehen kann und es an den Server senden, ohne Bitmap Erstellen

Es gibt nichts in Android für das, sorry.

+0

ist es möglich, 'bitmapOrg' zu löschen, bevor' 'routedBitamp'' erstellt wird, damit ich wenig Platz für die Arbeit habe? –

+0

@AalapPatel: Nein, denn dann hast du nichts zu drehen. – CommonsWare

+0

versuchte 1. Idee mit insamplesize 2 und es scheint zu arbeiten, ich muss immer noch Bitmap erstellen und dann Datei und dann diese Datei auf den Server, ich glaube nicht, es gibt eine andere Möglichkeit, gedrehte Datei ohne Bitmap zu senden .. –

0

Ich weiß, dass Sie irgendwann zu drehen, haben also hier Bitmap ist der Helfer i in den meisten meiner Projekt verwenden, lassen Sie mich wissen, wenn es Ihr Problem löst:

public static Bitmap getRotatedBitmap(Bitmap bm, float degree) { 
     Bitmap bitmap = bm; 
     if (degree != 0) { 
      Matrix matrix = new Matrix(); 
      matrix.preRotate(degree); 
//   if(shouldFlip) 
//    matrix.preScale(-1,1); 
      bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), 
        bm.getHeight(), matrix, true); 
     } 

     return bitmap; 
    } 
+0

Dies ist genau das, was ich tue und es gibt Fehler bei der gedrehten Bitmap-Erstellung von outofmemory Fehler –

Verwandte Themen