Zoeken…


Invoering

PorterDuff wordt beschreven als een manier om afbeeldingen te combineren alsof ze "onregelmatig gevormde stukjes karton" op elkaar zijn gelegd, evenals een schema voor het mengen van de overlappende delen

Opmerkingen

"Porter Duff" is op zichzelf een compositietechniek voor alfa's vernoemd naar een artikel van Thomas Porter en Tom Duff.

Om samen te vatten, de techniek neemt twee afbeeldingen met alfakanaal en genereert de uitvoerafbeelding door pixelwaarden van twee afbeeldingen te combineren. De verschillende combinatiemodi resulteren in verschillende uitvoerbeelden. In de volgende afbeelding wordt bijvoorbeeld de blauwe vorm (bron, bestaande pixels) gecombineerd met de gele vorm (bestemming, nieuwe pixels) in verschillende modi:

Porter-duff-modi

Een PorterDuff ColorFilter maken

PorterDuff.Mode wordt gebruikt om een PorterDuffColorFilter te maken. Een kleurenfilter wijzigt de kleur van elke pixel van een visuele bron.

ColorFilter filter = new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.SRC_IN);

Het bovenstaande filter kleurt de niet-transparante pixels in een blauwe kleur.

Het kleurenfilter kan worden toegepast op een Drawable :

drawable.setColorFilter(filter);

Het kan worden toegepast op een ImageView :

imageView.setColorFilter(filter);

Het kan ook op een Paint worden toegepast, zodat de kleur die met die verf wordt getekend, door het filter wordt gewijzigd:

paint.setColorFilter(filter);

Een PorterDuff XferMode maken

Een Xfermode (denk aan de "overdracht" -modus) werkt als een overdrachtsstap bij het tekenen van een pijplijn. Wanneer een Xfermode op een Paint wordt toegepast, worden de pixels die met de verf zijn getekend, gecombineerd met onderliggende pixels (al getekend) volgens de modus:

paint.setColor(Color.BLUE);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

Nu hebben we een blauwe tint verf. Elke vorm die wordt getekend, kleurt de reeds bestaande, niet-transparante pixels blauw in het gebied van de vorm.

Pas een radiaal masker (vignet) toe op een bitmap met PorterDuffXfermode

/**
 * Apply a radial mask (vignette, i.e. fading to black at the borders) to a bitmap
 * @param imageToApplyMaskTo Bitmap to modify
 */
public static void radialMask(final Bitmap imageToApplyMaskTo) {
    Canvas canvas = new Canvas(imageToApplyMaskTo);

    final float centerX = imageToApplyMaskTo.getWidth() * 0.5f;
    final float centerY = imageToApplyMaskTo.getHeight() * 0.5f;
    final float radius = imageToApplyMaskTo.getHeight() * 0.7f;

    RadialGradient gradient = new RadialGradient(centerX, centerY, radius,
            0x00000000, 0xFF000000, android.graphics.Shader.TileMode.CLAMP);

    Paint p = new Paint();
    p.setShader(gradient);
    p.setColor(0xFF000000);
    p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
    canvas.drawRect(0, 0, imageToApplyMaskTo.getWidth(), imageToApplyMaskTo.getHeight(), p);
}


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow