Java 仅更改一个值HSL

Java 仅更改一个值HSL,java,Java,这是我正在使用的当前代码,用于更改图像的色调、饱和度和亮度。我如何只改变饱和度或亮度而不添加色调?或者我如何找到像素的当前色调值,以便我可以使用它 public static final int MAX_COLOR = 256; private final float LUMINANCE_RED = 0.2126f; private final float LUMINANCE_GREEN = 0.7152f; private final float LUMINA

这是我正在使用的当前代码,用于更改图像的色调、饱和度和亮度。我如何只改变饱和度或亮度而不添加色调?或者我如何找到像素的当前色调值,以便我可以使用它

    public static final int MAX_COLOR = 256;

    private final float LUMINANCE_RED = 0.2126f;
    private final float LUMINANCE_GREEN = 0.7152f;
    private final float LUMINANCE_BLUE = 0.0722f;

    private double hue = 180;
    private double saturation = 50;
    private double lightness = 0;

    private int[] lum_red_lookup;
    private int[] lum_green_lookup;
    private int[] lum_blue_lookup;

    private int[] final_red_lookup;
    private int[] final_green_lookup;
    private int[] final_blue_lookup;

    public void doHSB(double t_hue, double t_sat, double t_bri, BufferedImage image)
    {
        hue = t_hue;
        saturation = t_sat;
        lightness = t_bri;
        doInit();
        doColorize(image);
    }
    private void doInit()
    {
        lum_red_lookup = new int[MAX_COLOR];
        lum_green_lookup = new int[MAX_COLOR];
        lum_blue_lookup = new int[MAX_COLOR];

        double temp_hue = hue / 360f;
        double temp_sat = saturation / 100f;

        final_red_lookup = new int[MAX_COLOR];
        final_green_lookup = new int[MAX_COLOR];
        final_blue_lookup = new int[MAX_COLOR];

        for (int i = 0; i < MAX_COLOR; ++i)
        {
            lum_red_lookup[i] = (int) (i * LUMINANCE_RED);
            lum_green_lookup[i] = (int) (i * LUMINANCE_GREEN);
            lum_blue_lookup[i] = (int) (i * LUMINANCE_BLUE);

            double temp_light = (double) i / 255f;

            Color color = new Color(Color.HSBtoRGB((float) temp_hue, (float) temp_sat, (float) temp_light));

            final_red_lookup[i] = (int) (color.getRed());
            final_green_lookup[i] = (int) (color.getGreen());
            final_blue_lookup[i] = (int) (color.getBlue());
        }
    }

    private void doColorize(BufferedImage image)
    {
        int height = image.getHeight();
        int width;

        while (height-- != 0)
        {
            width = image.getWidth();

            while (width-- != 0)
            {
                Color color = new Color(image.getRGB(width, height), true);

                int lum = lum_red_lookup[color.getRed()] + lum_green_lookup[color.getGreen()] + lum_blue_lookup[color.getBlue()];

                if (lightness > 0)
                {
                    lum = (int) ((double) lum * (100f - lightness) / 100f);
                    lum += 255f - (100f - lightness) * 255f / 100f;
                }
                else if (lightness < 0)
                {
                    lum = (int) (((double) lum * (lightness + 100f)) / 100f);
                }
                Color final_color = new Color(final_red_lookup[lum], final_green_lookup[lum], final_blue_lookup[lum], color.getAlpha());
                image.setRGB(width, height, final_color.getRGB());
            }
        }
    }
public static final int MAX_COLOR=256;
专用最终浮动亮度_RED=0.2126f;
专用最终浮动亮度_绿色=0.7152f;
专用最终浮动亮度_蓝=0.0722f;
私人双色调=180;
私人双饱和=50;
私人双亮度=0;
私有int[]lum_red_查找;
私有int[]lum_green_查找;
私有int[]lum_blue_查找;
私有int[]最终红色查找;
私有int[]最终绿色查找;
私有int[]最终查找;
公共空白doHSB(双色调、双色、双色、双色、缓冲图像)
{
色调=色调;
饱和度=t_sat;
亮度=t_bri;
doInit();
彩色化(图像);
}
私有void doInit()
{
lum_red_lookup=新整数[MAX_COLOR];
lum_green_lookup=新整数[MAX_COLOR];
lum_blue_lookup=新整数[MAX_COLOR];
双温色调=色调/360f;
双温度=饱和/100f;
最终红色查找=新整数[最大颜色];
最终绿色查找=新整数[最大颜色];
最终蓝色查找=新整数[最大颜色];
对于(int i=0;i0)
{
亮度=(整数)((双)亮度*(100f-亮度)/100f);
lum+=255f-(100f-亮度)*255f/100f;
}
否则如果(亮度<0)
{
亮度=(整数)((双)亮度*(亮度+100f))/100f);
}
颜色最终颜色=新颜色(最终红色查找[lum],最终绿色查找[lum],最终蓝色查找[lum],Color.getAlpha());
setRGB(宽度、高度、最终颜色.getRGB());
}
}
}

该类允许您单独调整每个属性。

您可以发布相关部分,而不是发布所有代码吗?谢谢编辑。但我只拿出了构造函数和类声明。这是我能得到的最短的时间,并且它仍然有效。希望这会有帮助。这会有很大帮助。谢谢