如何在JavaFX中重新设置图像的优先级

如何在JavaFX中重新设置图像的优先级,java,image,javafx,Java,Image,Javafx,我有一个RecolredImage的构造函数,它接受一个旧图像,并用一个新的彩色像素替换每个旧的彩色像素。然而,图像实际上并没有改变。注释之间的代码纯粹是为了测试目的,结果打印行根本不是我想要的新颜色 public RecoloredImaged(Image inputImage, Color oldColor, Color newColor) { int width = (int) inputImage.getWidth(); int height = (int) inputI

我有一个RecolredImage的构造函数,它接受一个旧图像,并用一个新的彩色像素替换每个旧的彩色像素。然而,图像实际上并没有改变。注释之间的代码纯粹是为了测试目的,结果打印行根本不是我想要的新颜色

public RecoloredImaged(Image inputImage, Color oldColor, Color newColor) {
    int width = (int) inputImage.getWidth();
    int height = (int) inputImage.getHeight();
    WritableImage outputImage = new WritableImage(width, height);
    PixelReader reader = inputImage.getPixelReader();
    PixelWriter writer = outputImage.getPixelWriter();
    // -- testing --
    PixelReader newReader = outputImage.getPixelReader();
    // -- end testing --
    int ob = (int) oldColor.getBlue() * 255;
    int or = (int) oldColor.getRed() * 255;
    int og = (int) oldColor.getGreen() * 255;
    int nb = (int) newColor.getBlue() * 255;
    int nr = (int) newColor.getRed() * 255;
    int ng = (int) newColor.getGreen() * 255;
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            int argb = reader.getArgb(x, y);
            int a = (argb >> 24) & 0xFF;
            int r = (argb >> 16) & 0xFF;
            int g = (argb >>  8) & 0xFF;
            int b =  argb        & 0xFF;
            if (g == og && r == or && b == ob) {
                r = nr;
                g = ng;
                b = nb;
            }
            argb = (a << 24) | (r << 16) | (g << 8) | b;
            writer.setArgb(x, y, argb);
            // -- testing -- 
            String s = Integer.toHexString(newReader.getArgb(x, y));
            if (!s.equals("0"))
                System.out.println(s);
            // -- end testing --
        }
    }
    image = outputImage;
}
public recoloredimage(图像输入图像、颜色oldColor、颜色newColor){
int width=(int)inputImage.getWidth();
int height=(int)inputImage.getHeight();
WritableImage outputImage=新的WritableImage(宽度、高度);
PixelReader=inputImage.getPixelReader();
PixelWriter writer=outputImage.getPixelWriter();
//--测试--
PixelReader newReader=outputImage.getPixelReader();
//--结束测试--
int ob=(int)oldColor.getBlue()*255;
int或=(int)oldColor.getRed()*255;
int og=(int)oldColor.getGreen()*255;
int nb=(int)newColor.getBlue()*255;
int nr=(int)newColor.getRed()*255;
int ng=(int)newColor.getGreen()*255;
对于(int y=0;y>24)&0xFF;
int r=(argb>>16)和0xFF;
int g=(argb>>8)&0xFF;
int b=argb&0xFF;
如果(g==og&&r==或&&b==ob){
r=nr;
g=ng;
b=铌;
}

argb=(a强制转换运算符的优先级高于乘法运算符。因此,
,…,
nb
值的计算将编译为与此代码相同的字节码:

int ob = ((int) oldColor.getBlue()) * 255;
int or = ((int) oldColor.getRed()) * 255;
int og = ((int) oldColor.getGreen()) * 255;
int nb = ((int) newColor.getBlue()) * 255;
int nr = ((int) newColor.getRed()) * 255;
int ng = ((int) newColor.getGreen()) * 255;
只需添加括号,告诉java在强制转换之前执行乘法,否则结果只能是0或255

int ob = (int) (oldColor.getBlue() * 255);
int or = (int) (oldColor.getRed() * 255);
int og = (int) (oldColor.getGreen() * 255);
int nb = (int) (newColor.getBlue() * 255);
int nr = (int) (newColor.getRed() * 255);
int ng = (int) (newColor.getGreen() * 255);

您没有更改输入图像,您正在创建一个新图像(outputImage)并写入该图像。您有一行代码
image=outputImage;
,我不知道应该这样做(
image
未定义)。我猜您的例程可能正在运行,但您只是没有在任何地方使用输出图像。可能的副本:image是一个实例变量。很抱歉。啊,这看起来不错。我会在可能的时候检查它。谢谢!