【问题标题】:javafx image color changejavafx图像颜色变化
【发布时间】:2017-04-11 03:02:42
【问题描述】:

我正在创建供用户选择的原始图像。我希望图像在用户点击后改变颜色

FileInputStream seats_fileInputStream = new FileInputStream("seat.png");
Image seats_image = new Image(seats_fileInputStream,50,50,false,false);

ImageView[] seats = new ImageView[30];

for(int i = 0;i<30;i++){
seats[i] = new ImageView(seats_image);
}

HBox seatsRaw_hbox[] = new HBox[5];
VBox seatsLine_vbox = new VBox();

int seatsCount = 0;
for(int i=0;i<5;i++){
  seatsRaw_hbox[i]= new HBox();
     for(int j=0;j<6;j++){       
   seatsRaw_hbox[i].getChildren().addAll(seats[seatsCount]);
   seatsCount++;
     }
   seatsLine_vbox.getChildren().add(seatsRaw_hbox[i]);

            } 

      BorderPane Test = new BorderPane();
      Test.setCenter(seatsLine_vbox);

我试图在点击后将图像更改为绿色:

Color targetColor = Color.GREEN;
    ColorAdjust colorAdjust = new ColorAdjust();
     colorAdjust.setSaturation(targetColor.getSaturation()); 
    colorAdjust.setHue(targetColor.getHue());
    colorAdjust.setBrightness(targetColor.getBrightness());


    seats[0].setOnMouseClicked(e->{
        seats[0].setEffect(colorAdjust);       
    });

但我总是得到奇怪的颜色

原图:

点击后得到的奇怪结果:

【问题讨论】:

  • “我总是有奇怪的颜色” -- 请解释一下并提供一些示例。
  • 还有seat.png 图像的外观如何?
  • @JimGarrison 我已经编辑了问题
  • @fabian 我已经编辑了问题
  • 输出应该是绿色矩形或圆角绿色矩形或深灰色区域变为绿色的矩形或...?

标签: java javafx imageview


【解决方案1】:

你为你的目的使用了错误的效果。 ColorAdjust 相对于每个像素的当前值改变每个像素的亮度、对比度等。这有助于使图片变暗,但不能使其变绿。

此外,获取黄色像素的亮度值并添加绿色像素的亮度值是没有意义的。在大多数情况下,结果将是可能的最高亮度值。

相反,您可以使用灯光效果。这可能适合您的需求。此效果模拟图像前面的(彩色)光源。使用绿色环境光会使图像变为绿色。

我做了一个例子:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.effect.Light;
import javafx.scene.effect.Lighting;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;


public class Main extends Application {

    @Override
    public void start(Stage stage) {
        HBox hbox = new HBox();

        ImageView imageView1 = new ImageView(new Image(Main.class.getResourceAsStream("/image.png")));
        ImageView imageView2 = new ImageView(new Image(Main.class.getResourceAsStream("/image.png")));
        hbox.getChildren().add(imageView1);
        hbox.getChildren().add(imageView2);

        Lighting lighting = new Lighting();
        lighting.setDiffuseConstant(1.0);
        lighting.setSpecularConstant(0.0);
        lighting.setSpecularExponent(0.0);
        lighting.setSurfaceScale(0.0);
        lighting.setLight(new Light.Distant(45, 45, Color.GREEN));

        imageView2.setEffect(lighting);

        stage.setScene(new Scene(hbox));
        stage.sizeToScene();
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-24
    • 2018-08-15
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 2018-02-17
    相关资源
    最近更新 更多