Buscar..


Introducción

PorterDuff se describe como una forma de combinar imágenes como si fueran "piezas de cartón de forma irregular" superpuestas unas sobre otras, así como un esquema para mezclar las partes superpuestas

Observaciones

"Porter Duff" en sí mismo es una técnica de composición alfa que lleva el nombre de un artículo de Thomas Porter y Tom Duff.

Para resumir, la técnica toma dos imágenes con canal alfa y genera la imagen de salida combinando los valores de píxeles de dos imágenes. Los diferentes modos de combinación dan como resultado una imagen de salida diferente. Por ejemplo, en la siguiente imagen, la forma azul (origen, píxeles existentes) se combina con la forma amarilla (destino, nuevos píxeles) en diferentes modos:

Modos de porter duff

Creando un PorterDuff ColorFilter

PorterDuff.Mode se utiliza para crear un PorterDuffColorFilter . Un filtro de color modifica el color de cada píxel de un recurso visual.

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

El filtro de arriba teñirá los píxeles no transparentes al color azul.

El filtro de color se puede aplicar a un Drawable :

drawable.setColorFilter(filter);

Se puede aplicar a un ImageView :

imageView.setColorFilter(filter);

Además, se puede aplicar a una Paint , de modo que el color que se dibuja con esa pintura sea modificado por el filtro:

paint.setColorFilter(filter);

Creando un PorterDuff XferMode

Un Xfermode (piense en el modo "transferencia") funciona como un paso de transferencia en el trazado de la tubería. Cuando se aplica un Xfermode a una Paint , los píxeles dibujados con la pintura se combinan con los píxeles subyacentes (ya dibujados) según el modo:

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

Ahora tenemos una pintura de tinte azul. Cualquier forma dibujada teñirá de azul los píxeles no transparentes ya existentes en el área de la forma.

Aplique una máscara radial (viñeta) a un mapa de bits usando 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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow