Ricerca…


introduzione

PorterDuff è descritto come un modo di combinare le immagini come se fossero "pezzi di cartone di forma irregolare" sovrapposti l'uno sull'altro, nonché uno schema per miscelare le parti sovrapposte

Osservazioni

"Porter Duff" in sé è una tecnica di compositing alfa che prende il nome da un articolo di Thomas Porter e Tom Duff.

Per riassumere, la tecnica prende due immagini con canale alfa e genera l'immagine di output combinando i valori dei pixel di due immagini. Le varie modalità di combinazione producono immagini di output differenti. Ad esempio, nell'immagine seguente, la forma blu (origine, pixel esistenti) viene combinata con la forma gialla (destinazione, nuovi pixel) in diverse modalità:

Modalità Duff Porter

Creazione di un filtro colorato PorterDuff

PorterDuff.Mode viene utilizzato per creare un PorterDuffColorFilter . Un filtro colore modifica il colore di ciascun pixel di una risorsa visiva.

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

Il filtro precedente colorerà i pixel non trasparenti con il colore blu.

Il filtro colore può essere applicato a un Drawable :

drawable.setColorFilter(filter);

Può essere applicato a un ImageView :

imageView.setColorFilter(filter);

Inoltre, può essere applicato a un Paint , in modo che il colore che viene disegnato usando quella vernice, venga modificato dal filtro:

paint.setColorFilter(filter);

Creazione di un XferMode PorterDuff

Un Xfermode (si pensi alla modalità "trasferimento") funziona come una fase di trasferimento nella pipeline di disegno. Quando un Xfermode viene applicato a un Paint , i pixel disegnati con la vernice vengono combinati con i pixel sottostanti (già disegnati) secondo la modalità:

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

Ora abbiamo una tinta blu. Qualsiasi forma disegnata colorerà i pixel già esistenti non trasparenti nell'area della forma.

Applicare una maschera radiale (vignetta) a una bitmap utilizzando 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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow