JavaFX中使用ColorPicker为T恤图片上色时颜色偏差问题求助
问题分析与解决方案
你用ColorAdjust实现颜色覆盖的思路不对,这个类是用来调整图片原有像素的色调、饱和度、亮度的,不是直接给图片叠加一层颜色,所以没法让T恤准确显示你选的颜色。
要实现颜色覆盖效果,推荐用ColorOverlay效果,或者结合ImageView的填充色与混合模式,下面是具体实现:
方案1:使用ColorOverlay(最直接的颜色覆盖)
这个效果可以直接在图片上叠加一层指定颜色,代码修改如下:
import javafx.scene.effect.ColorOverlay; // ... @FXML private void changecolor(ActionEvent event) { Color mycolor = mycolorpicker.getValue(); label.setBackground(new Background(new BackgroundFill(mycolor, null, null))); Image img = new Image(getClass().getResourceAsStream("tshirt7.PNG")); imageV.setImage(img); // 创建颜色覆盖效果 ColorOverlay colorOverlay = new ColorOverlay(); colorOverlay.setColor(mycolor); // 可选:调整覆盖透明度,0是完全透明,1是完全不透明,按需设置 // colorOverlay.setOpacity(0.7); imageV.setEffect(colorOverlay); }
方案2:用ImageView填充色+混合模式
如果想让颜色和T恤原有纹理融合得更自然,可以用这种方式,通过混合模式让填充色和图片颜色混合:
import javafx.scene.effect.BlendMode; // ... @FXML private void changecolor(ActionEvent event) { Color mycolor = mycolorpicker.getValue(); label.setBackground(new Background(new BackgroundFill(mycolor, null, null))); Image img = new Image(getClass().getResourceAsStream("tshirt7.PNG")); imageV.setImage(img); // 设置填充色和混合模式 imageV.setFill(mycolor); // 混合模式可选:MULTIPLY、OVERLAY、SRC_ATOP等,根据你的图片效果选 imageV.setBlendMode(BlendMode.MULTIPLY); }
为什么原来的代码不行?
colorAdjust.setHue(mycolor.getHue()/360):这里的hue是偏移量,不是设置成目标色调,比如原有图片的色调是0(红色),你选的颜色hue是120(绿色),它会把红色偏移120度变成绿色,但如果图片本身有多种颜色,结果就会混乱。setSaturation和setBrightness也是基于原有图片的参数调整,不是直接设置成目标颜色的饱和度和亮度,所以必然和你选的颜色有偏差。
内容的提问来源于stack exchange,提问作者zaman
相关产品推荐
相关产品推荐

