2011-11-30 5 views
14

Mam Bitmap o rozmiarze 320x480 i muszę naciągnąć go na różnych ekranach urządzeń, próbowałem przy użyciu to:Jak zmienić rozmiar bitmapy eficiently iz zewnątrz utraty jakości w Android

Rect dstRect = new Rect(); 
canvas.getClipBounds(dstRect); 
canvas.drawBitmap(frameBuffer, null, dstRect, null); 

to działa , obraz wypełnia cały ekran, tak jak chciałem, ale obraz jest pikselowany i wygląda źle. Potem próbowałem:

float scaleWidth = (float) newWidth/width; 
float scaleHeight = (float) newHeight/height; 
Matrix matrix = new Matrix(); 
matrix.postScale(scaleWidth, scaleHeight); 
Bitmap resizedBitmap = Bitmap.createBitmap(frameBuffer, 0, 0, 
       width, height, matrix, true); 
canvas.drawBitmap(resizedBitmap, 0, 0, null); 

tym razem wygląda na idealny, ładny i gładki, ale kod ten musi być w moim głównej pętli gry i tworzenia Bitmap s każda iteracja sprawia, że ​​bardzo powoli. Jak mogę zmienić rozmiar mojego obrazu, aby nie był pixelowany i szybko?

znaleziono rozwiązanie:

Paint paint = new Paint(); 
paint.setFilterBitmap(); 
canvas.drawBitmap(bitmap, matrix, paint); 
+2

Jeśli znalazłeś własne rozwiązanie, powinieneś dodać je jako odpowiedź na swoje pytanie i zaakceptować je samodzielnie, aby inni nie dodawali niechcianych odpowiedzi na twoje pytanie. – Kuffs

Odpowiedz

33

zmiany rozmiaru mapy bitowej

public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) 
{ 
    int width = bm.getWidth(); 
    int height = bm.getHeight(); 
    float scaleWidth = ((float) newWidth)/width; 
    float scaleHeight = ((float) newHeight)/height; 
    // create a matrix for the manipulation 
    Matrix matrix = new Matrix(); 
    // resize the bit map 
    matrix.postScale(scaleWidth, scaleHeight); 
    // recreate the new Bitmap 
    Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false); 
    return resizedBitmap; 
} 

Dość oczywista: wystarczy wprowadzić oryginalny obiekt bitmapy żądane wymiary mapę bitową, a ta metoda wróć do ciebie nowo zmodyfikowanej bitmapy! Może być, jest to przydatne dla Ciebie.

+0

@ user924941 Ta jednorazowa zmiana rozmiaru jest lepsza niż zmiana rozmiaru każdej klatki. –

+4

dla lepszej jakości skalowanego obrazu Zmieniono bitmapęBitmap = Bitmap.createBitmap (bm, 0, 0, szerokość, wysokość, macierz, prawda); –

+0

@BorisKarloff: Ustawienie parametru filtra nie ma wpływu na skalowanie w górę, co jest przedmiotem zainteresowania OP. –

0

Używam powyższego rozwiązania do zmiany rozmiaru bitmapy. Ale wynikowa część obrazu zostaje utracona.

Oto mój kod.

BitmapFactory.Options bmFactoryOptions = new BitmapFactory.Options(); 
      bmFactoryOptions.inPreferredConfig = Bitmap.Config.ARGB_8888; 
      bmFactoryOptions.inMutable = true; 
      bmFactoryOptions.inSampleSize = 2; 
      Bitmap originalCameraBitmap = BitmapFactory.decodeByteArray(pData, 0, pData.length, bmFactoryOptions); 
      rotatedBitmap = getResizedBitmap(originalCameraBitmap, cameraPreviewLayout.getHeight(), cameraPreviewLayout.getWidth() - preSizePriviewHight(), (int) rotationDegrees); 

public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight, int angle) { 
     int width = bm.getWidth(); 
     int height = bm.getHeight(); 
     float scaleWidth = ((float) newWidth)/width; 
     float scaleHeight = ((float) newHeight)/height; 
     Matrix matrix = new Matrix(); 
     matrix.postRotate(angle); 
     matrix.postScale(scaleWidth, scaleHeight); 
     Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true); 
     DeliverItApplication.getInstance().setImageCaptured(true); 
     return resizedBitmap; 
    } 

A oto wysokość obrazu i szerokości: wielkość podgląd powierzchni: 352: 288 Przed Zmieniono szerokość mapy bitowej 320 Wysokość: 240 szerokość CameraPreviewLayout: 1080 Wysokość: 1362 Zmieniono szerokość mapy bitowej 1022 Wzrost 1307

Powiązane problemy