web-dev-qa-db-fra.com

Dessiner des bitmaps à l’échelle régulière sur le canevas

Voici comment je dessine Bitmap sur Canvas dans mon application Android:

canvas.save();
canvas.scale(scale, scale, x, y);
canvas.drawBitmap(bitmap, x, y, null);
canvas.restore();

Cependant, la Bitmap n'est pas mise à l'échelle correctement, aucun anti-aliasing n'est effectué. Comment puis-je activer l'anti-aliasing?

30
fhucho

Essaye ça:

Paint paint = new Paint();
Paint.setAntiAlias(true);
Paint.setFilterBitmap(true);
Paint.setDither(true);

canvas.drawBitmap(bitmap, x, y, Paint);
71
Vit Khudenko

Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG); ou Paint.setFilterBitmap(true); fonctionnaient tous les deux pour moi, mais soyez très prudent, il réduisait le nombre d'images par seconde (FPS) de 30FPS à 17FPS uniquement. Donc, s'il s'agit d'un dessin essentiel à la mission, comme dans un jeu, vous devez redimensionner l'image au moment du chargement. Ce que j'ai fait de la manière suivante:

public Bitmap getImage (int id, int width, int height) {
    Bitmap bmp = BitmapFactory.decodeResource( getResources(), id );
    Bitmap img = Bitmap.createScaledBitmap( bmp, width, height, true );
    bmp.recycle();
    return img;
}
17
Sileria

Avez-vous essayé de créer un objet Paint, en appelant setAntiAlias(true) et en le passant à la méthode drawBitmap en tant que quatrième paramètre? Si cela ne fonctionne pas, vous devriez redimensionner l'appel drawBitmap au lieu de redimensionner le canevas, par exemple. en utilisant drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) .

3
mreichelt

Utilisation:

canvas.drawBitmap(source, 0, 0, new Paint(Paint.ANTI_ALIAS_FLAG)); 
0
Ingo