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());
}
}
}
该类允许您单独调整每个属性。您可以发布相关部分,而不是发布所有代码吗?谢谢编辑。但我只拿出了构造函数和类声明。这是我能得到的最短的时间,并且它仍然有效。希望这会有帮助。这会有很大帮助。谢谢