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

cette question a déjà une réponse ici:

comment redimensionner l'image (Bitmap) à 800*480 par exemple ? J'ai récupéré une image dans mon application qui est ~1MB et je dois la réduire à 800*480 J'ai chargé cette image et compressé mais comment faire pour le rendre plus petit :

ByteArrayOutputStream bos = new ByteArrayOutputStream(8192);
photo.compress(CompressFormat.JPEG, 25, bos); 
44
demandé sur Laurent Meyer 2011-12-12 11:37:39

5 réponses

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;
}
89
répondu Padma Kumar 2016-03-18 09:09:59
 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);
14
répondu Vaishali Sutariya 2014-08-06 09:54:12

vous pouvez dimensionner bitmaps en utilisant la toile.drawBitmap à la fourniture de la 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;
    }
10
répondu Jin35 2011-12-12 07:45:59

Les autres réponses sont correctes quant au "comment" de les redimensionner, mais je voudrais aussi jeté dans la recommandation simplement de prendre la résolution qui vous intéresse, pour commencer. La plupart des appareils Android offrent une gamme de résolutions et vous devriez choisir celle qui vous donne une taille de fichier que vous êtes à l'aise avec. La plus grande raison pour cela est que L'algorithme de mise à l'échelle natif Android (comme détaillé par Jin35 et Padma Kumar) produit des résultats assez merdiques. Il ne va pas vous donner Photoshop le redimensionnement de qualité, même le downscaling (pour ne rien dire du upscaling, que je sais que vous ne demandez pas, mais c'est juste un non-starter).

donc, vous devriez essayer leur solution et si vous êtes heureux avec le résultat, génial. Mais si ce n'est pas le cas, j'écrirais une fonction qui offre une plage de largeur dont vous êtes satisfait, et je chercherais cette dimension (ou ce qui est le plus proche) dans le tableau de taille d'image disponible de l'appareil et je la réglerais et l'utiliserais.

2
répondu Genia S. 2011-12-12 07:52:16

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
répondu BahaiResearch.com 2012-06-11 19:22:19