2 votes

Redimensionner le bitmap en un bitmap plus petit

J'ai une liste de bitmaps. Ce que je veux, c'est prendre ces bitmaps et, à l'aide de canvas, créer un nouveau bitmap avec des images réduites (c'est-à-dire les rendre minuscules) à partir de la liste de bitmaps que j'ai.

J'ai réussi à le faire, mais l'image est assez horrible à cause de la réduction d'échelle. J'ai essayé plusieurs choses, réglages, création de nouvelles toiles, etc.

La première solution simple ressemble à ceci (code ci-dessous), mais, comme je l'ai dit, les images sont affreuses.

public static Bitmap folderBitmap(Bitmap bitmap[]) {

    Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.RGB_565);
    Canvas c = new Canvas(b);

    c.drawARGB(255, 255, 255, 255);

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

    c.drawBitmap(getBit(bitmap), 4, 4, paint);
    c.drawBitmap(getBit(bitmap), 35, 4, paint);
    c.drawBitmap(getBit(bitmap), 67, 4, paint);

    c.drawBitmap(getBit(bitmap), 4, 35, null);
    c.drawBitmap(getBit(bitmap), 35, 35, null);
    c.drawBitmap(getBit(bitmap), 67, 35, null);

    c.drawBitmap(getBit(bitmap), 4, 67, null);
    c.drawBitmap(getBit(bitmap), 35, 67, null);
    c.drawBitmap(getBit(bitmap), 67, 67, null);

    return b;
}

private static Bitmap getBit(Bitmap[] b) {
    Bitmap newBitmap = Bitmap.createScaledBitmap(b[getR()], 28, 28, false);

    return newBitmap;
}

private static int getR() {
    Random r = new Random();
    int rint = r.nextInt(8);
    return rint;
}

Par horrible, je veux dire qu'elles ont l'air pixelisées et pas nettes.

5voto

blackbelt Points 45840

Utilisez inSampleSize pour mettre à l'échelle un Bitmap . Extrait de la documentation

S'il est défini à une valeur > 1, demande au décodeur de sous-échantillonner l'image originale. originale, renvoyant une image plus petite pour économiser de la mémoire. La taille de l'échantillon est le nombre de pixels dans l'une ou l'autre des dimensions qui correspondent à un seul pixel. pixel dans le bitmap décodé. Par exemple, inSampleSize == 4 renvoie une image image dont la largeur/hauteur est égale à 1/4 de celle de l'original et dont le nombre de pixels est égal à 1/16. nombre de pixels. Toute valeur <= 1 est traitée de la même manière que 1. Remarque : le décodeur utilise une valeur finale basée sur les puissances de 2, toute autre valeur sera arrondie. toute autre valeur sera arrondie à la puissance de 2 la plus proche.

Par exemple :

 BitmapFactory.Options opts = new BitmapFactory.Options();
 opt.inSampleSize = 4;
 Bitmap newBitmap = BitmapFactory.decodeFile(filePath, opts);

3voto

random Points 4318

Vous pouvez créer des miniatures d'images :

Bitmap thumbBitmap = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(filePath), thumbWidth, thumbHeight);

1voto

maclir Points 890

En utilisant votre code, si vous voulez augmenter la qualité selon la documentation pour chacun de ces paramètres vous devriez :

  1. Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888); : Chaque pixel est stocké sur 4 octets. Chaque canal (RVB et alpha pour la translucidité) est stocké sur 8 bits de précision (256 valeurs possibles.) Cette configuration est très flexible et offre la meilleure qualité. qualité. Elle devrait être utilisée chaque fois que possible.

  2. paint.setAntiAlias(true); : L'anticrénelage lisse les bords de ce qui est dessiné.

  3. paint.setFilterBitmap(true); : Le filtrage affecte l'échantillonnage des bitmaps lorsqu'ils sont transformés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X