由于性能原因,更好的像素计算方法

时间:2016-05-10 21:41:35

标签: java javafx

我有一个方法,它将javafx.scene.paint.color作为参数,并返回blackwhite作为color,具体取决于给定的brightness color

这是我的代码:

@Override
public Color getPixelColor(Color color) {
    return color.getBrightness() > cutOff ? Color.WHITE : Color.BLACK;
}

因为必须对pixel image的每个image size执行此操作,此方法可能需要一段时间,具体取决于if。 (对于全高清图像,代码将运行200万0个语句)

所以我的问题是,如果有一种方法/计算,它会给你1(黑色)或if(白色)作为结果,但不会使用任何{{1} }陈述。

提前致谢。

1 个答案:

答案 0 :(得分:6)

正如评论中所说 - 我怀疑这个特殊功能是瓶颈。但你仍然可以优化它。

如果你更深入并解编译getBrightness函数,你会发现它实际上是将R,G,B值转换为HSB然后只返回B.它使用com.sun.javafx.util.Utils.RGBtoHSB函数那个

进一步,在com.sun.javafx.util.Utils.RGBtoHSB我们将看到计算亮度,你需要从R,G,B中选择最大值

double cmax = (r > g) ? r : g;
if (b > cmax) cmax = b;
brightness = cmax;

所以,我们可以重新使用这些知识(没有数组分配,无用的色调/饱和度计算):

if ((clr.getRed() > cutoff) || (clr.getGreen() > cutoff) || (clr.getBlue() > cutoff)) {
    return Color.WHITE;
} else {
    return Color.BLACK;
}

或进一步优化(以消除if语句):

private static final Color[] BW_VALUES = {Color.BLACK, Color.WHITE};

public static Color convertToBW_1(final Color clr, final double cutoff) {
    /**
     * rd will be 0, if red channel under cutoff, ie black. rd will be 1, if red channel is above cutoff, ie white
     */
    final byte rd = (byte) (Double.doubleToRawLongBits(cutoff - clr.getRed()) >>> 63);
    final byte gd = (byte) (Double.doubleToRawLongBits(cutoff - clr.getGreen()) >>> 63);
    final byte bd = (byte) (Double.doubleToRawLongBits(cutoff - clr.getBlue()) >>> 63);

    /**
     * if at least one value is 1, then return white.
     */
    return BW_VALUES[rd | gd | bd];
}

根据我的快速测量 - 这个变种快2倍,但你的里程可能会有所不同