2015-12-10 11 views
14

Kiedy używam następującego kodu, kończy się on wyjątkiem wyjątku. Po wykonaniu badań Renderowanie skryptu wygląda na dobrego kandydata. Gdzie mogę znaleźć przykładowy kod do podobnej operacji i jak mogę go zintegrować z moim projektem.Obracanie mapy bitowej za pomocą skryptu renderowania 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

Czy zawsze zwracają one outofmem? Jaki rozmiar ma Twoja mapa bitowa? –

+0

Nie zawsze, ale od czasu do czasu. Myślę, że to z powodu kopii, która została stworzona. Korzystam z biblioteki Picassa, aby pobrać obraz i zmienić jego rozmiar, aby zmieścił się w połowie ekranu o rozmiarze – pats

+0

@MiloslawSmyk mój obraz jest próbkowany, rozmiar obrazu wynosi 110 KB, więc jest dość mały. W każdym razie, aby to zrobić, używając skryptowych operacji renderowania? – pats

Odpowiedz

1

zasadzie obracania mapy bitowej zadaniem obrotowy układ 2D bez stosowania dodatkowej pamięci. I to jest poprawna implementacja z RenderScript: Android: rotate image without loading it to memory.

Ale to nie jest konieczne, jeśli chcesz tylko wyświetlić obróconą mapę bitową. Można po prostu przedłużyć ImageView i obrócić Canvas podczas rysowania na nim:

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

Co ScriptIntrinsic, ponieważ jest to po prostu wbudowany jąder RenderScript dla typowych operacji nie można zrobić nic ponad już realizowanych funkcji: ScriptIntrinsic3DLUT, ScriptIntrinsicBLAS, ScriptIntrinsicBlend, ScriptIntrinsicBlur, ScriptIntrinsicColorMatrix, ScriptIntrinsicConvolve3x3, ScriptIntrinsicConvolve5x5, ScriptIntrinsicHistogram, ScriptIntrinsicLUT, ScriptIntrinsicResize, ScriptIntrinsicYuvToRGB. Nie obejmują one funkcji obracania bitmapy, więc powinieneś stworzyć własny skrypt ScriptC.

+0

Dzięki, już wypróbowałem rederscript algo zaproponowany w tym łączu. Naprawdę trudno jest ustawić rzeczy skryptowe, biorąc pod uwagę zamieszanie w wersjach w narzędziach do kompilacji. Zastanawiam się, czy istnieje sposób obracania przy użyciu scriptinstric i javacode avoidng scriptC – pats

0

Spróbuj tego kodu ..

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

użyć tego kodu, kiedy wybierz obraz z galerii.

tak ..

 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

Dziękuję za odpowiedź, ale nie widzę dużej różnicy, biorąc pod uwagę, że przypisuję nowy obraz do obrazu wejściowego po zwróceniu nowego obrazu z metody – pats

+0

dla różnicy sprawdzenia, Najpierw zrobisz zdjęcie z przedniej kamery, a następnie sprawdź ją za pomocą tej funkcji i bez korzystania z tej funkcji. –

+0

Ohh przepraszam, pobieram obraz z internetu. – pats

Powiązane problemy