java - 如何在 JavaFX 中重新着色图像

标签 java image javafx

我有以下 RecoloredImage 构造函数,它采用旧图像,并用新的彩色像素替换每个旧的彩色像素。然而,图像实际上并没有改变。注释之间的代码纯粹用于测试目的,生成的打印行根本不是我想要的新颜色。

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;
}

最佳答案

强制转换运算符的优先级高于乘法运算符。因此,您对 or、...、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);

关于java - 如何在 JavaFX 中重新着色图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58594078/

相关文章:

java - 组合框相同项目选定的操作监听器

java - 将操作事件处理程序添加到文本字段 java fx

java - Android-Gradle-app:transformResourcesWithMergeJavaResForDebug java.util.zip.ZipException

android - 上传图片路径到服务器android json

css - 如何通过CSS来延长页面的长度?

java - 通过 java 中的 url 检索单个图像

maven - JavaFX Maven 与 moditect 和 Java 11

java - 这个引用变量发生了什么?

java - 如何制作复合主键(java持久化注解)

java - 递归,词镜像自身