Android: Bild drehen, ohne es in den Speicher zu laden

Ich frage mich, ist es möglich, ein auf der sdcard gespeichertes Bild zu drehen, ohne es zu laden.

Der Grund dafür ist, warum ich das suchen, ist berühmt OutOfMemoryError. Ich weiß, ich kann es vermeiden, indem du ein großes Bild abtastet, aber in Wirklichkeit möchte ich die Größe dieses Bildes nicht reduzieren, ich möchte das Originalbild haben, aber um 90 Grad gedreht werden.

  • Libgdx macht die Schriftarten nach dem Fortsetzen nicht ordnungsgemäß
  • So senden Sie eine E-Mail mit einem Dateianhang in Android
  • Android Studio: Ice Cream Sandwich (API Level 15) Gerätekonfiguration wird nicht angezeigt, obwohl das Systembild installiert ist
  • Android-Anwendung Login mit Facebook funktioniert nicht mit Facebook App installiert
  • Wie bekomme ich Antwort als String mit Retrofit ohne GSON oder jede andere Bibliothek in Android
  • Android externe Datenspeicherprobleme
  • Irgendwelche Vorschläge darüber sind herzlich willkommen 🙂

  • Augmented Reality Framework
  • AlertDialog mit Checkbox In android
  • Making Image Vollbild auf Android Tutorial App
  • Quellwert 1.5 ist veraltet und wird in einer zukünftigen Version entfernt
  • Legen Sie die Farbe der TextView-Spanne in Android fest
  • "Android Studio" Debugging - Anzeige von Variablen als hexadezimal
  • 4 Solutions collect form web for “Android: Bild drehen, ohne es in den Speicher zu laden”

    Sie sollten decodieren dekodieren die Images using Bitmap`. Sie sollten folgen Laden Großes Bild von Google präsentiert, wie es zu tun .. es hat mir sehr geholfen, werden Sie den großen Unterschied in der RAM-Nutzung bemerken ..

    UPDATE Wenn alles, was Sie wollen, nur das Bild drehen, können Sie diesen Code verwenden

     Matrix matrix = new Matrix(); matrix.setRotate(90); result = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),bitmap.getHeight(), matrix, false); 

    Wenn du nur die Bildausrichtung einstellen musst (zB die Fotoausrichtung, wenn es genommen wurde) kannst du benutzen

     ExifInterface exif = new ExifInterface(filePath); 

    Mit dem Attribut ExifInterface.TAG_ORIENTATION Ich hoffe das hilft dir

    Bildbeschreibung hier eingeben

    Für die 90-Grad-Rotationen umarme ich wirklich RenderScript, das genau entworfen ist, um mit Bitmaps umzugehen und ist unerwartet sogar noch schneller als die Standard- Bitmap.createBitmap() . Die In-Process-Bitmap wird nicht auf dem Java-Heap gespeichert und drückt dich daher nicht in OutOfMemoryError .

    Nachdem Sie die RenderScript-Unterstützung in Ihrem Projekt mit wenigen Zeilen eingerichtet haben, ist hier der RenderScript-Algorithmus zu verwenden:

    1) Erstellen Sie app\src\main\rs\rotator.rs RenderScript-Datei mit dem folgenden Inhalt.

     #pragma version(1) #pragma rs java_package_name(ua.kulku.rs) rs_allocation inImage; int inWidth; int inHeight; uchar4 __attribute__ ((kernel)) rotate_90_clockwise (uchar4 in, uint32_t x, uint32_t y) { uint32_t inX = inWidth - 1 - y; uint32_t inY = x; const uchar4 *out = rsGetElementAt(inImage, inX, inY); return *out; } uchar4 __attribute__ ((kernel)) rotate_270_clockwise (uchar4 in, uint32_t x, uint32_t y) { uint32_t inX = y; uint32_t inY = inHeight - 1 - x; const uchar4 *out = rsGetElementAt(inImage, inX, inY); return *out; } 

    ua.kulku.rs auf ua.kulku.rs , das ist ein Paketname, den Sie für die Auto-Generierung RS Java-Schnittstelle wählen.

    2) Verweisen Sie es in Ihrem Java-Code:

     import ua.kulku.rs.ScriptC_rotator; public Bitmap rotate(Bitmap bitmap) { RenderScript rs = RenderScript.create(mContext); ScriptC_rotator script = new ScriptC_rotator(rs); script.set_inWidth(bitmap.getWidth()); script.set_inHeight(bitmap.getHeight()); Allocation sourceAllocation = Allocation.createFromBitmap(rs, bitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT); bitmap.recycle(); script.set_inImage(sourceAllocation); int targetHeight = bitmap.getWidth(); int targetWidth = bitmap.getHeight(); Bitmap.Config config = bitmap.getConfig(); Bitmap target = Bitmap.createBitmap(targetWidth, targetHeight, config); final Allocation targetAllocation = Allocation.createFromBitmap(rs, target, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT); script.forEach_rotate_90_clockwise(targetAllocation, targetAllocation); targetAllocation.copyTo(target); rs.destroy(); return target; } 

    Bildbeschreibung hier eingeben

    Bei 180-Grad-Rotationen übertraf die NDK- Lösung RenderScript, wie für mich, aufgrund der Verwendung des sequentiellen Array-Elementzugriffs, da die 180-Grad-Drehung tatsächlich die Umkehrung des Bildpixel-Arrays ist. Der NDK-Algorithmus, den ich in diesen Vergleichen verwendet habe, ist von https://github.com/AndroidDeveloperLB/AndroidJniBitmapOperations . Die in-Prozess-Bitmap wird auch nicht auf dem Java-Heap gespeichert und verhindert OutOfMemoryError .

    Die Stats Bars zeigen, was ich in Millisekunden auf meinem Samsung S4 (Android 5.0) für die 13 MP Foto.

    Ich habe hier eine sehr langsame und dennoch speicherfreundliche Lösung gemacht.

    Ich bin sicher, es gibt bessere Möglichkeiten und würde es lieben, von ihnen zu wissen

    Wenn du mit verschiedenen Formaten umgehen musst, dann wird es ein Schmerz sein Sie müssen in der Lage sein, die verschiedenen Formate zu verstehen und in der Lage zu lesen / schreiben / verwandeln sie, wahrscheinlich durch Ströme. Auf einem regulären PC würde ich sagen, auf ImageMagick zu schauen, der eine sehr große Bildunterstützung hat. Ich suchte nach einem Android-Port und kam mit diesem . Es könnte einen Versuch wert sein. Es sieht aber unvollendet aus, also müsstest du wahrscheinlich etwas Arbeit für eine bessere Formatabdeckung machen.

    Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.