Autore Topic: Disegnare una immagine(semitrasparente) su di un'altra  (Letto 539 volte)

Offline Sime

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei P8 Lite
  • Sistema operativo:
    Windows 7
Disegnare una immagine(semitrasparente) su di un'altra
« il: 19 Ottobre 2017, 15:43:42 CEST »
0
Ho la necessità di disegnare una immagine img1 sopra un'altra immagine img2.
img1 ha la caratterista di essere in parte trasparente (diciamo alfa = 215).

A tal proposito cerco di fare ciò con il seguente codice:
Codice (Java): [Seleziona]
{
   // Carico le immagini
   Bitmap imageBellezza = BitmapFactory.decodeResource(getResources(), R.drawable.bellezza_in_bikini);
   Bitmap alfa = BitmapFactory.decodeResource(getResources(), R.drawable.bellezza_alfa);
       
   Bitmap.Config bitmapConfig = imageBellezza.getConfig();
   // set default bitmap config if none
   if (bitmapConfig == null)  bitmapConfig = Bitmap.Config.ARGB_8888;
   // resource bitmaps are imutable, so we need to convert it to mutable one
   imageBellezza = imageBellezza.copy(bitmapConfig, true);
       
   Bitmap.Config bitmapConfig2 = alfa.getConfig();
   if (bitmapConfig2 == null)  bitmapConfig2 = Bitmap.Config.ARGB_8888;
   alfa = alfa.copy(bitmapConfig2, true);

   Bitmap newBitmap = putOver(imageBellezza, alfa);
   gLayout.setBackground(new BitmapDrawable(getResources(), newBitmap));
}

public Bitmap putOver(Bitmap master, Bitmap alphaBitmap)
{
        Canvas canvas = new Canvas(master);
        Paint paint = new Paint();
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OVER));
        canvas.drawBitmap(alphaBitmap, 0, 0, paint);
        return master;
}

Il fatto è che l'immagine sottostante rimane sempre visibile come se non avessi sovrapposto niente! Dove Sbaglio?

Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 836
  • Respect: +184
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:Disegnare una immagine(semitrasparente) su di un'altra
« Risposta #1 il: 20 Ottobre 2017, 11:12:02 CEST »
0
Se usi immagini trasparenti non hai bisogno di definire lo setXfermode. Prova così:

Codice (Java): [Seleziona]
public Bitmap putOver(Bitmap master, Bitmap alphaBitmap)
{
        Bitmap result = Bitmap.createBitmap(master.getWidth(), master.getHeight(), master.getConfig());
        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        canvas.drawBitmap(master, 0, 0, null);
        canvas.drawBitmap(alphaBitmap, 0, 0, null);
        return result;
}
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Sime

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei P8 Lite
  • Sistema operativo:
    Windows 7
Re:Disegnare una immagine(semitrasparente) su di un'altra
« Risposta #2 il: 20 Ottobre 2017, 12:09:47 CEST »
0
Funziona, perfetto!

Io però avrei bisogno di variare a piacere il valore del canale alfa(opacità) a run-time dell'immagine che sovrappongo, quindi devo creare al volo quello che caricavo da file!


Offline Ohmnibus

  • Utente senior
  • ****
  • Post: 836
  • Respect: +184
    • Github
    • Google+
    • @ohmnibus
    • Mostra profilo
    • Lords of Knowledge GdR
  • Dispositivo Android:
    Huawei P9 Lite
  • Play Store ID:
    Ohmnibus
  • Sistema operativo:
    Windows 10 x64
Re:Disegnare una immagine(semitrasparente) su di un'altra
« Risposta #3 il: 20 Ottobre 2017, 12:14:41 CEST »
0
Prova così:

Codice (Java): [Seleziona]
public Bitmap putOver(Bitmap master, Bitmap alphaBitmap)
{
        Bitmap result = Bitmap.createBitmap(master.getWidth(), master.getHeight(), master.getConfig());
        Canvas canvas = new Canvas(result);
        canvas.drawBitmap(master, 0, 0, null);
        Paint paint = new Paint();
        paint.setAlpha(50); //Trasparenza 50%
        canvas.drawBitmap(alphaBitmap, 0, 0, paint);
        return result;
}

Riferimento: https://stackoverflow.com/a/5118938/466938
Ohmnibus
Le mie app su Play Store

È stata trovata una soluzione al tuo problema? Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato.

Offline Sime

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Huawei P8 Lite
  • Sistema operativo:
    Windows 7
Re:Disegnare una immagine(semitrasparente) su di un'altra
« Risposta #4 il: 20 Ottobre 2017, 14:19:26 CEST »
0
Ho risolto, funziona bene!

Di devo segnalare però nel codice che
Codice (Java): [Seleziona]
paint.setAlpha(50); //Trasparenza 50%non è corretta la percentuale.

il valore infatti è compreso tra 0 e 255.

Comunque grazie!