Как перекрасить изображение в JavaFX - PullRequest
0 голосов
/ 28 октября 2019

У меня есть следующий конструктор для 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;
}

1 Ответ

1 голос
/ 28 октября 2019

Оператор приведения имеет более высокий приоритет, чем оператор умножения. Поэтому ваши вычисления для значений 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...