Как затемнить холст или изображение, нарисованное на холсте? - PullRequest
1 голос
/ 30 ноября 2011

Я получил класс Canvas, где в методе paint я рисую Image.При нажатии Command я хочу нарисовать на холсте прямоугольник и строку внутри прямоугольника, и изображение будет по-прежнему отображаться за прямоугольником, поэтому я хочу немного затемнить изображение, потому что хочу создать визуальный эффекткак при отображении диалога LWUIT (оттенок скрытой формы).Так как же затемнить холст в этой ситуации?

1 Ответ

1 голос
/ 30 ноября 2011

Предполагая, что ширина и высота изображения известны, я бы сначала использовал Image.getRGB , чтобы получить значения ARGB для пикселей изображения.

Затем я бы масштабировал значения RGB, чтобы эффект стал темнее.

int[] darken(int[] argb, int percentage) {
    int[] result = new int[argb.length];
    for (int i = 0; i <argb.length; i++) {
        result[i] = darkenArgb(argb[i], percentage);
    }
    return result;
}

private int darkenArgb(int argb, int percentage) {
    return darkenByte(argb, 3, 100) // keep alpha as-is
            | darkenByte(argb, 2, percentage)
            | darkenByte(argb, 1, percentage)
            | darkenByte(argb, 0, percentage);
}

private int darkenByte(int argb, int index, int percentage) {
    if (percentage < 0 || percentage > 100) {
        throw new IllegalArgumentException("unexpected percentage: ["
               + percentage + "]");
    }
    if (index < 0 || index > 3) {
        throw new IllegalArgumentException("unexpected index: [" + index + "]");
    }
    int result = (argb >> index) & 0xFF;
    result = result * percentage / 100;
    return result << index;
}

Из массива, полученного методом darken, затемненное изображение может быть получено с использованием Image.createRGBImage

...