2015-12-10 7 views
14

Wenn ich folgenden Code verwenden, endet es mit outofmemory Ausnahme. Nach der Recherche scheint das Render-Skript ein guter Kandidat zu sein. Wo finde ich Beispielcode für ähnliche Operationen und wie kann ich sie in mein Projekt integrieren?Drehen Sie eine Bitmap mit Render-Skript Android

public Bitmap rotateBitmap(Bitmap image, int angle) { 
    if (image != null) { 

     Matrix matrix = new Matrix(); 
     matrix.postRotate(angle, (image.getWidth())/2, 
       (image.getHeight())/2); 

     return Bitmap.createBitmap(image, 0, 0, image.getWidth(), 
       image.getHeight(), matrix, true); 
    } 
    return null; 
} 
+0

Gibt es immer wieder outofmem? Welche Größe hat Ihre Bitmap? –

+0

Nicht immer, aber gelegentlich. Ich denke es ist wegen der Kopie erstellt worden. Ich benutze Picasso-Bibliothek, um das Bild herunterzuladen und die Größe zu ändern, um die halbe Bildschirmgröße zu passen – pats

+0

@MiloslawSmyk mein Bild ist downsampled, Bildgröße ist 110 KB, so dass es ziemlich klein ist. Wie auch immer, dies mit ScriptInstric-Operationen von pendantscript zu tun? – pats

Antwort

1

Grundsätzlich rotierenden Bitmap ist eine Aufgabe, 2D-Array zu drehen, ohne zusätzlichen Speicher. Und das ist die korrekte Implementierung mit RenderScript: Android: rotate image without loading it to memory.

Aber das ist nicht notwendig, wenn Sie nur gedrehte Bitmap anzeigen möchten. Sie können einfach ImageView verlängern und die Canvas drehen, während die Zeichnung auf es:

canvas.save(); 
canvas.rotate(angle, X + (imageW/2), Y + (imageH/2)); 
canvas.drawBitmap(imageBmp, X, Y, null); 
canvas.restore(); 

Was ScriptIntrinsic, da es nur eine eingebaute in render Kernel für gemeinsame Operationen, die Sie nicht nichts über den bereits implementierten Funktionen tun können: ScriptIntrinsic3DLUT, ScriptIntrinsicBLAS, ScriptIntrinsicBlend, ScriptIntrinsicBlur, ScriptIntrinsicColorMatrix, ScriptIntrinsicConvolve3x3, ScriptIntrinsicConvolve5x5, ScriptIntrinsicHistogram, ScriptIntrinsicLUT, ScriptIntrinsicResize, ScriptIntrinsicYuvToRGB. Sie enthalten derzeit keine Funktionalität zum Drehen von Bitmap, sodass Sie ein eigenes ScriptC-Skript erstellen sollten.

+0

Danke, ich habe schon das rederscript algo in diesem Link vorgeschlagen. Es ist wirklich schwierig, scriptC-Sachen einzurichten, angesichts der Verwirrung in Versionen in Build-Tools. Ich frage mich, gibt es eine Möglichkeit, mit scriptinstric und javacode Vermeidung scriptC zu drehen – pats

0

diesen Code Versuchen ..

private Bitmap RotateImage(Bitmap _bitmap, int angle) { 

    Matrix matrix = new Matrix(); 
    matrix.postRotate(angle); 
    _bitmap = Bitmap.createBitmap(_bitmap, 0, 0, _bitmap.getWidth(), _bitmap.getHeight(), matrix, true); 
    return _bitmap; 
} 

Verwenden Sie diesen Code, wenn das Auswahlbild aus der Galerie.

wie folgt ..

 File _file = new File(file_name); 
    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inSampleSize = 1; 
    Bitmap bitmap = BitmapFactory.decodeFile(file_name, options); 

    try { 
      ExifInterface exif = new ExifInterface(file_name); 
      int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); 
      if (orientation == ExifInterface.ORIENTATION_ROTATE_90) { 
       bitmap = RotateImage(bitmap, 90); 
      } else if (orientation ==ExifInterface.ORIENTATION_ROTATE_270) { 
       bitmap = RotateImage(bitmap, 270); 

      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     image_holder.setImageBitmap(bitmap); 
+0

Danke für die Antwort, aber ich sehe nicht viel Unterschied, da ich das neue Bild dem Eingabebild zuweisen, nachdem neues Bild von der Methode – pats

+0

für Scheckdifferenz zurückgegeben wird, zuerst Sie Bild erfassen von der Frontkamera, und überprüfen Sie es dann mit dieser Funktion und ohne diese Funktion zu verwenden. –

+0

Ohh Entschuldigung, ich lade das Bild aus dem Internet herunter. – pats