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 Bitmap
s à 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);
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.
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