web-dev-qa-db-fra.com

Création d'un bitmap à l'échelle avec createScaledBitmap dans Android

Je veux créer une image bitmap à l'échelle, mais j'obtiens apparemment une image disproportionnée. Cela ressemble à un carré alors que je veux être rectangulaire.

Mon code:

Bitmap resizedBitmap = Bitmap.createScaledBitmap(myBitmap, 960, 960, false);

Je veux que l'image ait un MAX de 960. Comment puis-je faire cela? La définition de la largeur sur null ne se compile pas. C'est probablement simple, mais je ne peux pas envelopper ma tête. Merci

16
EGHDK

Si vous avez déjà le bitmap d'origine en mémoire, vous n'avez pas besoin de faire tout le processus de inJustDecodeBounds, inSampleSize, etc. .

final int maxSize = 960;
int outWidth;
int outHeight;
int inWidth = myBitmap.getWidth();
int inHeight = myBitmap.getHeight();
if(inWidth > inHeight){
    outWidth = maxSize;
    outHeight = (inHeight * maxSize) / inWidth; 
} else {
    outHeight = maxSize;
    outWidth = (inWidth * maxSize) / inHeight; 
}

Bitmap resizedBitmap = Bitmap.createScaledBitmap(myBitmap, outWidth, outHeight, false);

Si la seule utilisation de cette image est une version à l'échelle, il vaut mieux utiliser la réponse de Tobiel, pour minimiser l'utilisation de la mémoire.

53
Geobits

Votre image est carrée car vous définissez width = 960 et height = 960.

Vous devez créer une méthode où vous passez la taille de l'image que vous voulez comme ceci: http://developer.Android.com/training/displaying-bitmaps/load-bitmap.html

Dans le code, cela ressemble à ceci:

public static Bitmap lessResolution (String filePath, int width, int height) {
    int reqHeight = height;
    int reqWidth = width;
    BitmapFactory.Options options = new BitmapFactory.Options();    

    // First decode with inJustDecodeBounds=true to check dimensions
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(filePath, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;        

    return BitmapFactory.decodeFile(filePath, options); 
}

private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {

    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {
        // Calculate ratios of height and width to requested height and width
        final int heightRatio = Math.round((float) height / (float) reqHeight);
        final int widthRatio = Math.round((float) width / (float) reqWidth);

        // Choose the smallest ratio as inSampleSize value, this will guarantee
        // a final image with both dimensions larger than or equal to the
        // requested height and width.
        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
    }
    return inSampleSize;
}
18
Tobiel
bmpimg = Bitmap.createScaledBitmap(srcimg, 100, 50, true);
2
user3243151