web-dev-qa-db-fra.com

Comment redimensionner une image bitmap efficacement et sans perte de qualité dans Android

J'ai une Bitmap avec une taille de 320x480 et je dois l'étirer sur différents écrans de périphérique, j'ai essayé d'utiliser ceci:

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

cela fonctionne, l'image remplit tout l'écran comme je le voulais mais l'image est pixélisée et le rendu est mauvais. Puis j'ai essayé:

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

cette fois, il semble parfait, agréable et fluide, mais ce code doit être dans ma boucle de jeu principale et créer Bitmaps à chaque itération le rend très lent. Comment puis-je redimensionner mon image pour qu'elle ne soit pas pixélisée et que le travail soit fait rapidement?

TROUVEZ LA SOLUTION:

Paint paint = new Paint();
Paint.setFilterBitmap();
canvas.drawBitmap(bitmap, matrix, Paint);
14
user924941

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

C'est assez explicite: il suffit de saisir l'objet Bitmap d'origine et les dimensions souhaitées du Bitmap, et cette méthode vous renverra le Bitmap redimensionné! Peut-être, cela vous sera utile.

33
Piyush

J'utilise la solution ci-dessus pour redimensionner le bitmap. Mais il en résulte qu'une partie de l'image est perdue.

Voici mon code.

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

Et voici la hauteur et la largeur de l'image: Taille de la surface de prévisualisation: 352: 288 Largeur du bitmap redimensionné: 320 Hauteur: 240 CameraPreviewLayout width: 1080 Hauteur: 1362 Largeur du bitmap redimensionné: 1022 Hauteur: 1307

0
Shakeera Bettal