Drehen einer Bitmap mit JNI & NDK

9

Hintergrund:

Ich habe entschieden, dass Bitmaps sehr viel Arbeitsspeicher beanspruchen, was leicht zu Fehlern bei Arbeitsspeicher führen kann. Daher werde ich die harte, speicherintensive Arbeit an C / C ++ - Code schreiben.

Die Schritte zum Drehen einer Bitmap sind:

  1. Bitmap-Informationen (Breite, Höhe) lesen
  2. speichert Bitmap-Pixel in einem Array.
  3. recycle die Bitmap.
  4. Erstellen Sie ein neues Bitmap mit umgekehrter Größe.
  5. setze die Pixel in die neue Bitmap.
  6. Geben Sie die Pixel frei und geben Sie die Bitmap zurück.

Das Problem:

Auch wenn alles fehlerfrei läuft, ist das Ausgabebild keine Rotation des Originals. Tatsächlich ruiniert es es vollständig.

Die Rotation sollte im Gegenuhrzeigersinn erfolgen, 90 Grad.

Beispiel (der Screenshot ist vergrößert), was ich bekomme:

Wie Sie sehen können, sind nicht nur die Farben seltsamer geworden, sondern die Größe stimmt nicht mit meinen Einstellungen überein. Etwas ist hier wirklich komisch.

Vielleicht lese ich die Daten nicht richtig?

Natürlich ist das nur ein Beispiel. Der Code sollte auf jeder Bitmap funktionieren, solange das Gerät über genügend Speicher verfügt, um es zu halten. Außerdem möchte ich andere Operationen an der Bitmap durchführen, als sie zu drehen.

Code, den ich erstellt habe:

Android.mk-Datei:

%Vor%

cpp-Datei:

%Vor%

Java-Datei:

%Vor%

BEARBEITEN: Nachdem ich meine Antwort bekommen habe, möchte ich diesen Code und Notizen darüber für alle teilen:

  • Damit es funktioniert, habe ich im Code jede Instanz von "uint16_t" durch "uint32_t" ersetzt (das ist der Fehler in meinem Code, nach dem ich gefragt habe).

  • Eingabe- und Ausgabe-Bitmap muss mit 8888 config sein (was ARGB ist)

  • Eingabebitmap wird während des Prozesses wiederverwendet.

  • Der Code dreht das Bild um 90 Grad gegen den Uhrzeigersinn. Natürlich können Sie es je nach Ihren Bedürfnissen ändern.

bessere Lösung

Ich habe einen netten Post mit dieser Funktionalität und anderen gemacht, hier .

    
android developer 18.01.2013, 12:10
quelle

1 Antwort

5

Da Sie ARGB_8888 format verwenden, ist jedes Pixel ein uint32_t nicht uint16_t . Versuchen Sie, Ihre gedrehte Bitmap-Erstellung zu ändern, um uint32_t für Quell- und Zielarrays zu verwenden, und es sollte besser funktionieren.

    
harism 18.01.2013, 12:48
quelle