Szukaj…


Wprowadzenie

PorterDuff jest opisany jako sposób łączenia obrazów tak, jakby były to „nieregularne kawałki kartonu” nałożone na siebie, a także schemat mieszania zachodzących na siebie części

Uwagi

„Porter Duff” sam w sobie jest techniką kompozytowania alfa nazwaną na cześć artykułu Thomasa Portera i Toma Duffa.

Podsumowując, technika wykonuje dwa obrazy z kanałem alfa i generuje obraz wyjściowy, łącząc wartości pikseli dwóch obrazów. Różne tryby łączenia dają różne obrazy wyjściowe. Na przykład na poniższym obrazku niebieski kształt (źródło, istniejące piksele) jest łączony z żółtym kształtem (miejsce docelowe, nowe piksele) w różnych trybach:

Tryby portera

Tworzenie filtru kolorów PorterDuff

PorterDuff.Mode służy do tworzenia PorterDuffColorFilter . Filtr kolorów modyfikuje kolor każdego piksela zasobu wizualnego.

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

Powyższy filtr spowoduje odbarwienie nieprzezroczystych pikseli do koloru niebieskiego.

Filtr kolorów można zastosować do Drawable :

drawable.setColorFilter(filter);

Można go zastosować do ImageView :

imageView.setColorFilter(filter);

Można go również zastosować do Paint , dzięki czemu kolor rysowany za pomocą tej farby jest modyfikowany przez filtr:

paint.setColorFilter(filter);

Tworzenie PorterDuff XferMode

Xfermode (tryb „transferu”) działa jako krok transferu w rysowaniu potoku. Kiedy Xfermode zostanie zastosowany do Paint , piksele narysowane za pomocą farby są łączone z pikselami leżącymi poniżej (już narysowanymi) zgodnie z trybem:

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

Teraz mamy niebieską farbę. Każdy narysowany kształt zabarwi już istniejące, nieprzezroczyste piksele na niebiesko w obszarze kształtu.

Zastosuj maskę promieniową (winietę) do mapy bitowej za pomocą 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow