/**
* 图片切换特定颜色
* originalColor 原始色
* image 图片
* targetColor 目标色
* minSemblance 最小相似度(0到1),最小相似度取1则只替换一种颜色,而非一个颜色区
*/
public static Image pixLightColorWithImage(Color originalColor, Image image, Color targetColor, double minSemblance){
PixelReader pixelReader = image.getPixelReader();
if(image.getWidth()>0 && image.getHeight() >0){
WritableImage wImage;
wImage = new WritableImage(
(int)image.getWidth(),
(int)image.getHeight());
PixelWriter pixelWriter = wImage.getPixelWriter();
for(int y = 0; y < image.getHeight(); y++){
for(int x = 0; x < image.getWidth(); x++){
Color color = pixelReader.getColor(x, y);
double semblance = getColorSemblance(originalColor, color);
// 选择颜色相似程度区间
if(semblance >= minSemblance && semblance <= 1){
// 换色
color = targetColor;
}
pixelWriter.setColor(x, y, color);
}
}
return wImage;
}
return null;
}
public static double getColorSemblance(Color color1, Color color2){
// 此处Color为javafx.scene.paint.Color,getRed()为红色通道的程度,getRed() * 255为红色通道的值
double semblance = (255 - (Math.abs(color1.getRed() - color2.getRed()) * 255 * 0.297 + Math.abs(color1.getGreen() - color2.getGreen()) * 255 * 0.593 + Math.abs(color1.getBlue() - color2.getBlue()) * 255 * 11.0 / 100)) / 255;
return semblance;
}