Java 基于CSS样式表更改图像颜色

Java 基于CSS样式表更改图像颜色,java,javafx,javafx-8,javafx-css,Java,Javafx,Javafx 8,Javafx Css,我有ImageView,我希望图像根据附加到场景的样式表中的全局CSS属性更改其颜色 .root { theme-image-color: red; } 我已经有一个实用的方法,可以改变颜色 public static final Image changeImageColor(Image originalImage, Color desiredColor) 此方法返回具有所需颜色的Image的新实例。它是使用writeableimage、PixelReader和PixelWriter

我有
ImageView
,我希望图像根据附加到
场景的样式表中的全局CSS属性更改其颜色

.root
{
    theme-image-color: red;
}
我已经有一个实用的方法,可以改变颜色

public static final Image changeImageColor(Image originalImage, Color desiredColor)
此方法返回具有所需颜色的
Image
的新实例。它是使用
writeableimage
PixelReader
PixelWriter
实现的,但它们在这里并不重要

可以在运行时切换附加到场景的样式表。当样式表更改时,如何使图像更改颜色

我认为唯一有意义的是创建一个新的JavaFXCSS属性(例如,
-image-color:theme-image-color;
),但似乎不可能像这样添加这个属性

编辑 看起来我还应该包括
changeImageColor()
方法

public static final WritableImage changeImageColor(Image image, Color newColor)
{
    if (image == null)
        throw new IllegalArgumentException("Cannot change the color of a null image.");

    WritableImage newImage = new WritableImage((int) image.getWidth(), (int) image.getHeight());
    PixelWriter writer = newImage.getPixelWriter();
    PixelReader reader = image.getPixelReader();

    for (int readY = 0; readY < image.getHeight(); readY++)
    {
        for (int readX = 0; readX < image.getWidth(); readX++)
        {
            Color color = reader.getColor(readX, readY);
            if (color.getOpacity() > 0)
            {
                writer.setColor(readX, readY, newColor);
            }
        }
    }

    return newImage;
}
公共静态最终可写图像changeImageColor(图像图像,颜色newColor)
{
if(image==null)
抛出新的IllegalArgumentException(“无法更改空图像的颜色”);
WritableImage newImage=新的WritableImage((int)image.getWidth(),(int)image.getHeight());
PixelWriter=newImage.getPixelWriter();
PixelReader=image.getPixelReader();
for(int readY=0;readY0)
{
setColor(readX、readY、newColor);
}
}
}
返回新图像;
}

如何转换图像(如果图像完全被颜色填充,则改为使用
矩形
)?您是否提取了一个通道(如果是这样,是否只能有R、G或B?)?你是否使用了根据给定亮度调整的所需颜色?@fabian该方法可能并不重要。但无论如何,我检查了每个像素的颜色,以查看其不透明度是否为非零,并将其更改为指定的颜色。返回值是一个
可写图像
,它被转换成
图像
。该方法很重要,因为可以通过混合模式实现某些效果。但无法达到afaik的阈值。