2011-11-30 10 views
14

Ho un Bitmap con una dimensione di 320x480 e ho bisogno di allungare su diverse schermate del dispositivo, ho provato ad utilizzare questo:Come ridimensionare una bitmap eficiently e con fuori perdere la qualità in Android

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

funziona , l'immagine riempie l'intero schermo come volevo ma l'immagine è pixelata e sembra male. Poi ho provato:

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

questa volta sembra perfetto, piacevole e scorrevole, ma questo codice deve essere nel mio ciclo di gioco principale e la creazione di Bitmap s ogni iterazione lo rende molto lento. Come posso ridimensionare la mia immagine in modo che non venga sottoposta a pixel e che venga eseguita velocemente?

trovato la soluzione:

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

Se hai trovato la tua soluzione, dovresti aggiungerla come risposta alla tua domanda e accettarla tu stesso in modo che altri non aggiungano risposte indesiderate alla tua domanda. – Kuffs

risposta

33

ridimensionamento di un bitmap:

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

abbastanza autoesplicativo: semplicemente inserire l'oggetto originale bitmap e le dimensioni desiderate della bitmap, e detto metodo ritorna a te il bitmap ridimensionato di recente! Può essere, è utile per te.

+0

@ user924941 Questo ridimensionamento singolo è preferibile al ridimensionamento di ogni fotogramma. –

+4

per un'immagine in scala di qualità migliore Bitmap ridimensionataBitmap = Bitmap.createBitmap (bm, 0, 0, larghezza, altezza, matrice, vero); –

+0

@BorisKarloff: l'impostazione del parametro del filtro non ha alcun effetto durante l'upscaling, che l'OP è interessato a fare. –

0

Sto usando la soluzione di cui sopra per ridimensionare la bitmap. Ma risulta che parte dell'immagine è stata persa.

Questo è il mio codice.

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

E qui è l'altezza e la larghezza dell'immagine: dimensioni Anteprima superficie: 352: 288 Prima di larghezza bitmap ridimensionata: 320 Altezza: 240 Larghezza CameraPreviewLayout: 1080 Altezza: 1362 ridimensionata larghezza bitmap: 1022 Altezza: 1307

Problemi correlati