0

我正在与 一起工作RGB,但我遇到了这个数学问题。除非我读错了下面的引用,否则我需要取这个结果,这是一个看起来像的值0.01234并将其反转。bgc = bottom colorfgc = top color。我在反转结果时遇到问题。现在的方式我得到了Color Dodge效果而不是Color Burn效果。我尝试过乘法、除法、加法、减法,但似乎没有任何效果。我能做些什么来反转结果?

(255f - (float)bgc[0]) / (fgc[0] << 8)

这是完整的方法:

public static int colorBurn(int bg, int fg){
    int[] bgc = Colors.getrgba(bg);
    int[] fgc = Colors.getrgba(fg);
    int r = (bgc[0] == 255 ? bgc[0] : (int)Math.min(0, (255f - (float)bgc[0]) / (fgc[0] << 8)));
    int g = (bgc[1] == 255 ? bgc[1] : (int)Math.min(0, (255f - (float)bgc[1]) / (fgc[1] << 8)));
    int b = (bgc[2] == 255 ? bgc[2] : (int)Math.min(0, (255f - (float)bgc[2]) / (fgc[2] << 8)));
    return Colors.rgba(r, g, b);
}

这是维基百科所说的:

颜色加深模式将反转的底层除以顶层,然后反转结果。这会使顶层变暗,增加对比度以反映底层的颜色。底层越深,使用的颜色越多。与白色混合不会产生任何差异。

4

1 回答 1

1

我得到了它:

public static int colorBurn(int bg, int fg){
    int[] bgc = Colors.getrgba(bg);
    int[] fgc = Colors.getrgba(fg);
    int r = (int)Math.min(255, 255 * (1 - (1 - (bgc[0] / 255f)) / (fgc[0] / 255f)));
    int g = (int)Math.min(255, 255 * (1 - (1 - (bgc[1] / 255f)) / (fgc[1] / 255f)));
    int b = (int)Math.min(255, 255 * (1 - (1 - (bgc[2] / 255f)) / (fgc[2] / 255f)));
    r = r < 0 ? 0 : r;
    g = g < 0 ? 0 : g;
    b = b < 0 ? 0 : b;
    return Colors.rgba(r, g, b);
}
于 2013-05-15T03:16:52.440 回答