web-dev-qa-db-fra.com

Comment redimensionner une image (Bitmap) à une taille donnée?

Comment redimensionner une image (bitmap) à 800 * 480 par exemple par programme? J'ai récupéré une image dans mon application d'environ 1 Mo et je dois la réduire à 800 * 480. J'ai chargé cette image et je l'ai comprimée, mais comment puis-je la réduire?

ByteArrayOutputStream bos = new ByteArrayOutputStream(8192);
photo.compress(CompressFormat.JPEG, 25, bos); 
47
Damir
Bitmap scaledBitmap = scaleDown(realImage, MAX_IMAGE_SIZE, true);

Méthode de réduction d'échelle:

public static Bitmap scaleDown(Bitmap realImage, float maxImageSize,
        boolean filter) {
    float ratio = Math.min(
            (float) maxImageSize / realImage.getWidth(),
            (float) maxImageSize / realImage.getHeight());
    int width = Math.round((float) ratio * realImage.getWidth());
    int height = Math.round((float) ratio * realImage.getHeight());

    Bitmap newBitmap = Bitmap.createScaledBitmap(realImage, width,
            height, filter);
    return newBitmap;
}
97
Padma Kumar
 Bitmap yourBitmap;
 Bitmap resized = Bitmap.createScaledBitmap(yourBitmap, newWidth, newHeight, true);

ou:

 resized = Bitmap.createScaledBitmap(yourBitmap,(int)(yourBitmap.getWidth()*0.8), (int)(yourBitmap.getHeight()*0.8), true);
15
Vaishali Sutariya

Vous pouvez redimensionner les bitmaps en utilisant canvas.drawBitmap avec matrice, par exemple:

public static Bitmap scaleBitmap(Bitmap bitmap, int wantedWidth, int wantedHeight) {
        Bitmap output = Bitmap.createBitmap(wantedWidth, wantedHeight, Config.ARGB_8888);
        Canvas canvas = new Canvas(output);
        Matrix m = new Matrix();
        m.setScale((float) wantedWidth / bitmap.getWidth(), (float) wantedHeight / bitmap.getHeight());
        canvas.drawBitmap(bitmap, m, new Paint());

        return output;
    }
11
Jin35

Dans MonoDroid, voici comment (c #)

/// <summary>
/// Graphics support for resizing images
/// </summary>
public static class Graphics
{
    public static Bitmap ScaleDownBitmap(Bitmap originalImage, float maxImageSize, bool filter)
    {
        float ratio = Math.Min((float)maxImageSize / originalImage.Width, (float)maxImageSize / originalImage.Height);
        int width = (int)Math.Round(ratio * (float)originalImage.Width);
        int height =(int) Math.Round(ratio * (float)originalImage.Height);

        Bitmap newBitmap = Bitmap.CreateScaledBitmap(originalImage, width, height, filter);
        return newBitmap;
    }

    public static Bitmap ScaleBitmap(Bitmap originalImage, int wantedWidth, int wantedHeight)
    {
        Bitmap output = Bitmap.CreateBitmap(wantedWidth, wantedHeight, Bitmap.Config.Argb8888);
        Canvas canvas = new Canvas(output);
        Matrix m = new Matrix();
        m.SetScale((float)wantedWidth / originalImage.Width, (float)wantedHeight / originalImage.Height);
        canvas.DrawBitmap(originalImage, m, new Paint());
        return output;
    }

}
2
BahaiResearch.com

Les autres réponses sont correctes quant à "comment" les redimensionner, mais je voudrais également ajouter la recommandation visant à saisir simplement la résolution qui vous intéresse, pour commencer. La plupart des appareils Android offrent une gamme de résolutions et vous devez en choisir une qui vous donne une taille de fichier avec laquelle vous êtes à l'aise. La raison principale en est que le fichier natif Android (détaillé par Jin35 et Padma Kumar) produit des résultats assez nauséabonds. c'est juste un non-starter).

Donc, vous devriez essayer leur solution et si vous êtes satisfait du résultat, tant mieux. Mais sinon, j'écrirais une fonction offrant une plage de largeur qui vous conviendrait, recherchant cette dimension (ou celle la plus proche) dans le tableau de tailles d'image disponible du périphérique, puis la définissant et l'utilisant.

2
Genia S.