JavaFX генерирует пустое одноцветное изображение - PullRequest
0 голосов
/ 04 марта 2020

Я хотел бы создать изображение с одним цветом, чтобы использовать его для создания карт для PhongMaterials. Что-то вроде

Image generateImage(int width, int height, double red, double green, double blue, double opacity);

Что мне нужно сделать, чтобы сделать это? Хотя я предпочел бы сделать это чисто процедурно, если есть способ сделать это, предоставив ему чистое белое изображение типа https://dummyimage.com/600x400/ffffff/fff.png и изменив его цвет, я тоже с этим согласен. Я думал о создании URL-адреса и получении изображения непосредственно с этого веб-сайта, но я не могу зависеть от целого rnet соединения, чтобы это работало (и, кроме того, этот веб-сайт не обрабатывает прозрачные изображения).

1 Ответ

3 голосов
/ 04 марта 2020

Чтобы вернуть изображение, как вы указали, вы можете сделать:

public Image generateImage(int width, int height, double red, double green, double blue, double opacity) {
    WritableImage img = new WritableImage(width, height);
    PixelWriter pw = img.getPixelWriter();

    // Should really verify 0.0 <= red, green, blue, opacity <= 1.0        
    int alpha = (int) (opacity * 255) ;
    int r = (int) (red * 255) ;
    int g = (int) (green * 255) ;
    int b = (int) (blue * 255) ;

    int pixel = (alpha << 24) | (r << 16) | (g << 8) | b ;
    int[] pixels = new int[width * height];
    Arrays.fill(pixels, pixel);

    pw.setPixels(0, 0, width, height, PixelFormat.getIntArgbInstance(), pixels, 0, width);
    return img ;
}

Практически во всех случаях использования (которые я могу придумать) вы можете также создать изображение размером 1 пиксель по 1 пиксель, а затем масштабировать его на лету. Если этого достаточно, вы можете упростить это до

public Image generateImage(double red, double green, double blue, double opacity) {
    WritableImage img = new WritableImage(1, 1);
    PixelWriter pw = img.getPixelWriter();

    Color color = Color.color(red, green, blue, opacity);
    pw.setColor(0, 0, color);
    return img ;
}

Тогда, например, вы можете сделать:

Image marshallUniGreen = generateImage(0, 177.0 / 255, 65.0 / 255, 1) ; 
ImageView imageView = new ImageView(marshallUniGreen);
imageView.setFitWidth(300);
imageView.setFitHeight(200);
imageView.setPreserveRatio(false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...