如何在JavaFX中重新设置图像的优先级
我有一个RecolredImage的构造函数,它接受一个旧图像,并用一个新的彩色像素替换每个旧的彩色像素。然而,图像实际上并没有改变。注释之间的代码纯粹是为了测试目的,结果打印行根本不是我想要的新颜色如何在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
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是一个实例变量。很抱歉。啊,这看起来不错。我会在可能的时候检查它。谢谢!