55 votes

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

Comment redimensionner une image (Bitmap) à 800*480 par exemple de manière programmatique ? J'ai récupéré une image dans mon application qui fait ~1MB et j'ai besoin de la réduire à 800*480. J'ai chargé cette image et l'ai compressée mais comment faire pour la réduire ?

ByteArrayOutputStream bos = new ByteArrayOutputStream(8192);
photo.compress(CompressFormat.JPEG, 25, bos);

112voto

Padma Kumar Points 10698
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;
}

27voto

Vaishali Points 359
 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);

13voto

Jin35 Points 6244

Vous pouvez mettre à l'échelle les bitmaps en utilisant canvas.drawBitmap avec une matrice fournie, 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;
    }

2voto

Genia S. Points 12190

Les autres réponses sont correctes quant au "comment" les redimensionner, mais je recommanderais également de commencer par prendre la résolution qui vous intéresse. La plupart des appareils Android offrent une gamme de résolutions et vous devriez choisir celle qui vous donne une taille de fichier avec laquelle vous êtes à l'aise. La raison principale est que l'algorithme de mise à l'échelle natif d'Android (tel que détaillé par Jin35 et Padma Kumar) produit des résultats plutôt médiocres. Vous n'obtiendrez pas un redimensionnement de qualité Photoshop, ni même une réduction d'échelle (sans parler de l'augmentation d'échelle, qui n'est pas l'objet de votre demande, mais qui est tout simplement impossible).

Vous devriez donc essayer leur solution et si vous êtes satisfait du résultat, tant mieux. Mais si ce n'est pas le cas, j'écrirais une fonction qui offre une plage de largeur qui vous convient, et qui recherche cette dimension (ou la plus proche) dans le tableau des tailles d'images disponibles de l'appareil, puis je la définirais et l'utiliserais.

2voto

BahaiResearch.com Points 14967

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

}

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