Suche…


Einführung

PorterDuff wird als eine Möglichkeit beschrieben, Bilder so zu kombinieren, als wären sie "unregelmäßig geformte Kartonstücke", die übereinander angeordnet sind, sowie ein Schema zum Mischen der überlappenden Teile

Bemerkungen

"Porter Duff" an sich ist eine Alpha-Compositing-Technik, benannt nach einem Artikel von Thomas Porter und Tom Duff.

Zusammenfassend nimmt die Technik zwei Bilder mit Alphakanal und erzeugt das Ausgabebild durch Kombinieren der Pixelwerte von zwei Bildern. Die verschiedenen Kombinationsmodi führen zu unterschiedlichen Ausgabebildern. Im folgenden Bild wird beispielsweise die blaue Form (Quelle, vorhandene Pixel) mit der gelben Form (Ziel, neue Pixel) in verschiedenen Modi kombiniert:

Portier Duff-Modi

Erstellen eines PorterDuff ColorFilter

PorterDuff.Mode wird zum Erstellen eines PorterDuffColorFilter . Ein Farbfilter ändert die Farbe jedes Pixels einer visuellen Ressource.

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

Der obige Filter färbt die nicht transparenten Pixel blau ein.

Der Farbfilter kann auf ein Drawable :

drawable.setColorFilter(filter);

Es kann auf eine ImageView :

imageView.setColorFilter(filter);

Es kann auch auf eine Paint angewendet werden, sodass die Farbe, die mit dieser Farbe gezeichnet wird, vom Filter geändert wird:

paint.setColorFilter(filter);

Erstellen eines PorterDuff-XferMode

Ein Xfermode Modus (think "transfer" -Modus) dient als Übertragungsschritt beim Zeichnen der Pipeline. Wenn ein Xfermode auf einen Paint angewendet wird, werden die mit dem Paint gezeichneten Pixel mit darunter liegenden Pixeln (bereits gezeichnet) gemäß dem Modus kombiniert:

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

Jetzt haben wir eine blaue Tönungsfarbe. Jede gezeichnete Form färbt die bereits vorhandenen, nicht transparenten Pixel im Bereich der Form blau.

Wenden Sie eine radiale Maske (Vignette) mit PorterDuffXfermode auf eine Bitmap an

/**
 * 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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow