web-dev-qa-db-fra.com

Android: Comment superposer une image bitmap/dessiner une image bitmap?

J'ai en fait deux questions:

  1. Est-il préférable de dessiner une image sur un bitmap ou de créer un bitmap en tant que ressource, puis de le dessiner sur un bitmap? Performance sage ... lequel est le meilleur?
  2. Si je veux dessiner quelque chose de transparent sur un bitmap, comment pourrais-je le faire?
  3. Si je veux superposer un bitmap transparent sur un autre, comment le ferais-je?

Désolé pour la longue liste, mais dans l'intérêt d'apprendre, j'aimerais explorer les deux approches ...

54
Legend

Je ne peux pas croire que personne n'a encore répondu à cette question! Une occurrence rare sur SO!

1

La question n'a pas vraiment de sens pour moi. Mais si vous lui parlez de dessiner directement sur un canevas (polygones, ombrage, texte, etc.), chargez un bitmap et appliquez-le sur le canevas, ce qui dépend de la complexité de votre dessin. Au fur et à mesure que le dessin se complexifie, le temps de calcul nécessaire augmente en conséquence . Cependant, le fait de coller une image bitmap sur une toile est toujours une durée constante, proportionnelle à la taille de l'image bitmap.

2

Sans savoir ce qu'est "quelque chose", comment puis-je vous montrer comment le faire? Vous devriez être capable de comprendre le n ° 2 à partir de la réponse du n ° 3.

3

Hypothèses:

  • bmp1 est le plus gros des deux
  • vous voulez que les deux soient superposés à partir du coin supérieur gauche.

        private Bitmap overlay(Bitmap bmp1, Bitmap bmp2) {
            Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig());
            Canvas canvas = new Canvas(bmOverlay);
            canvas.drawBitmap(bmp1, new Matrix(), null);
            canvas.drawBitmap(bmp2, new Matrix(), null);
            return bmOverlay;
        }
    
98
Declan Shanaghy

Vous pouvez faire quelque chose comme ça:

public void putOverlay(Bitmap bitmap, Bitmap overlay) {
    Canvas canvas = new Canvas(bitmap);
    Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG);
    canvas.drawBitmap(overlay, 0, 0, Paint);
} 

L'idée est très simple: une fois que vous avez associé un bitmap à un canevas, vous pouvez appeler n'importe quelle méthode du canevas pour dessiner sur le bitmap.

Cela fonctionnera pour les bitmaps transparents. Un bitmap aura la transparence, s'il a un canal alpha. Regardez Bitmap.Config . Vous voudrez probablement utiliser ARGB_8888.

Important: Regardez cet exemple Android pour connaître les différentes manières de dessiner. Cela vous aidera beaucoup.

Sur le plan des performances (en termes de mémoire, pour être exact), les bitmaps sont les meilleurs objets à utiliser, car elles enveloppent simplement un bitmap natif. Une ImageView est une sous-classe de View et un BitmapDrawable contient une Bitmap à l'intérieur, mais elle contient également beaucoup d'autres choses. Mais ceci est une simplification excessive. Vous pouvez suggérer un scénario spécifique à la performance pour une réponse précise.

28
Lior
public static Bitmap overlayBitmapToCenter(Bitmap bitmap1, Bitmap bitmap2) {
    int bitmap1Width = bitmap1.getWidth();
    int bitmap1Height = bitmap1.getHeight();
    int bitmap2Width = bitmap2.getWidth();
    int bitmap2Height = bitmap2.getHeight();

    float marginLeft = (float) (bitmap1Width * 0.5 - bitmap2Width * 0.5);
    float marginTop = (float) (bitmap1Height * 0.5 - bitmap2Height * 0.5);

    Bitmap overlayBitmap = Bitmap.createBitmap(bitmap1Width, bitmap1Height, bitmap1.getConfig());
    Canvas canvas = new Canvas(overlayBitmap);
    canvas.drawBitmap(bitmap1, new Matrix(), null);
    canvas.drawBitmap(bitmap2, marginLeft, marginTop, null);
    return overlayBitmap;
}
12
AnsonChen

Je pense que cet exemple va certainement vous aider à superposer une image transparente sur une autre image. Ceci est rendu possible en dessinant les images sur la toile et en renvoyant une image bitmap. 

Lire la suite ou télécharger la démo here

private Bitmap createSingleImageFromMultipleImages(Bitmap firstImage, Bitmap secondImage){

        Bitmap result = Bitmap.createBitmap(firstImage.getWidth(), firstImage.getHeight(), firstImage.getConfig());
        Canvas canvas = new Canvas(result);
        canvas.drawBitmap(firstImage, 0f, 0f, null);
        canvas.drawBitmap(secondImage, 10, 10, null);
        return result;
    }

et appelez la fonction ci-dessus en cliquant sur le bouton et transmettez les deux images à notre fonction, comme indiqué ci-dessous

public void buttonMerge(View view) {

        Bitmap bigImage = BitmapFactory.decodeResource(getResources(), R.drawable.img1);
        Bitmap smallImage = BitmapFactory.decodeResource(getResources(), R.drawable.img2);
        Bitmap mergedImages = createSingleImageFromMultipleImages(bigImage, smallImage);

        img.setImageBitmap(mergedImages);
    }

Pour plus de deux images, vous pouvez suivre ce lien, comment fusionner plusieurs images par programme sur Android

1
Daniel Nyamasyo

Si le but est d'obtenir un bitmap, c'est très simple:

Canvas canvas = new Canvas();
canvas.setBitmap(image);
canvas.drawBitmap(image2, new Matrix(), null);

En fin de compte, l'image contiendra le chevauchement d'image et image2.

1
Giorgio Barchiesi
public static Bitmap createSingleImageFromMultipleImages(Bitmap firstImage, Bitmap secondImage, ImageView secondImageView){

    Bitmap result = Bitmap.createBitmap(firstImage.getWidth(), firstImage.getHeight(), firstImage.getConfig());
    Canvas canvas = new Canvas(result);
    canvas.drawBitmap(firstImage, 0f, 0f, null);
    canvas.drawBitmap(secondImage, secondImageView.getX(), secondImageView.getY(), null);

    return result;
}
0
Svitlana