【问题标题】:JavaFX generate blank single color ImageJavaFX 生成空白单色图像
【发布时间】:2020-03-04 18:59:52
【问题描述】:

我想生成一张只有一种颜色的图像,用于为 PhongMaterials 创建地图。类似的东西

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

我需要做什么才能做到这一点?虽然我更喜欢纯粹通过程序来实现,但如果有办法通过给它一个像https://dummyimage.com/600x400/ffffff/fff.png 这样的空白图像并改变它的颜色来做到这一点,我也可以接受。我考虑过只生成一个 URL 并直接从该网站获取图像,但我不能依赖互联网连接才能使其工作(此外,该网站不处理透明图像)。

【问题讨论】:

  • 如果是纯单色,这里的宽高真的有需求吗?例如。在ImageView 中,您可以将 1 像素乘 1 像素的图像缩放到所需的大小,从而节省计算时间和内存
  • 这也行得通!你是怎么做到的?

标签: image javafx


【解决方案1】:

要返回您指定的图像,您可以这样做:

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

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2011-11-25
    相关资源
    最近更新 更多