Поиск…


Вступление

PorterDuff описывается как способ комбинирования изображений, как если бы они были «фигурами неправильной формы картона», наложенными друг на друга, а также схемой смешивания перекрывающихся частей

замечания

«Портер Дафф» сам по себе является альфа-композиционной техникой, названной в честь работы Томаса Портера и Тома Даффа.

Подводя итог, техника берет два изображения с альфа-каналом и генерирует выходное изображение, комбинируя значения пикселей двух изображений. Различные режимы комбинирования приводят к разному выходному изображению. Например, на следующем изображении синяя форма (источник, существующие пиксели) объединяется с желтой формой (назначение, новые пиксели) в разных режимах:

Режимы портера Duff

Создание фильтра PorterDuff ColorFilter

PorterDuff.Mode используется для создания PorterDuffColorFilter . Цветовой фильтр изменяет цвет каждого пикселя визуального ресурса.

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

Вышеуказанный фильтр будет оттенять непрозрачные пиксели до синего цвета.

Цветовой фильтр можно применить к Drawable :

drawable.setColorFilter(filter);

Его можно применять к ImageView :

imageView.setColorFilter(filter);

Кроме того, он может быть применен к Paint , так что цвет, который рисуется с использованием этой краски, изменяется фильтром:

paint.setColorFilter(filter);

Создание PorterDuff XferMode

Xfermode (думаю, «передача») работает как шаг передачи в чертежном конвейере. Когда Xfermode применяется к Paint , пиксели, нарисованные краской, объединяются с базовыми пикселями (уже нарисованными) в соответствии с режимом:

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

Теперь у нас есть синяя краска. Любая обрамленная фигура будет оттенять уже существующие, непрозрачные синие пиксели в области формы.

Примените радиальную маску (виньетку) к растровому изображению, используя 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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow