2015-12-10 18 views
14

Quando utilizzo il seguente codice, si finisce con un'eccezione di eccezione. Dopo aver eseguito la ricerca, lo script Render sembra un buon candidato. Dove posso trovare un codice di esempio per operazioni simili e come posso integrarlo nel mio progetto.Ruota una bitmap utilizzando lo script di rendering 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

Restituisce sempre outofmem? Di che taglia è la tua bitmap? –

+0

Non sempre, ma occasionalmente. Penso che sia perché la copia è stata creata. Uso la libreria Picasso per scaricare l'immagine e ridimensionarla per adattarla alle dimensioni dello schermo. – pats

+0

@MiloslawSmyk L'immagine è stata sottoposta a campionamento, la dimensione dell'immagine è di 110 KB, quindi è piuttosto piccola. Ad ogni modo per fare ciò usando le operazioni di ScriptInstric di renderscript? – pats

risposta

1

Fondamentalmente rotante bitmap è un compito di rotazione array 2D senza usare memoria aggiuntiva. E questa è l'implementazione corretta con RenderScript: Android: rotate image without loading it to memory.

Ma questo non è necessario se tutto ciò che si desidera è solo visualizzare Bitmap ruotata. Si può semplicemente estendere ImageView e ruotare il Canvas mentre disegnando su di essa:

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

Che dire ScriptIntrinsic, dal momento che è solo un built-in kernel RenderScript per le operazioni più comuni, non si può fare nulla al di sopra delle funzioni già implementate: ScriptIntrinsic3DLUT, ScriptIntrinsicBLAS, ScriptIntrinsicBlend, ScriptIntrinsicBlur, ScriptIntrinsicColorMatrix, ScriptIntrinsicConvolve3x3, ScriptIntrinsicConvolve5x5, ScriptIntrinsicHistogram, ScriptIntrinsicLUT, ScriptIntrinsicResize, ScriptIntrinsicYuvToRGB. Non includono funzionalità per ruotare bitmap al momento, quindi è necessario creare il proprio script ScriptC.

+0

Grazie, ho già provato la modifica algo proposta in quel collegamento. È davvero difficile configurare scriptC, data la confusione nelle versioni degli strumenti di compilazione. Mi chiedevo c'è un modo per ruotare usando scriptinstric e javacode avoidng scriptC – pats

0

Prova questo codice ..

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; 
} 

Utilizzare questo codice quando Scegli immagine dalla galleria.

simili ..

 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

Grazie per la risposta, ma non vedo molta differenza, dato che assegno la nuova immagine all'immagine di input dopo che la nuova immagine viene restituita dal metodo – pats

+0

per la differenza di controllo, prima di catturare l'immagine dalla fotocamera frontale, quindi controllarlo utilizzando questa funzione e senza utilizzare questa funzione. –

+0

Ohh scusate, ho scaricato l'immagine da internet. – pats