JavaFX中修改Rectangle容器ImagePattern填充图像色相的实现问题
灰度图像ImagePattern色相调整失效问题解决方案
问题原因
- 色相调整的本质是修改已有彩色像素的色相属性,纯灰度(白、黑、灰)像素的饱和度值为0,本身不存在色相属性,所以直接调整色相不会产生任何效果,该现象和图像是否携带透明通道无关。
- 此前测试的黄色PNG本身饱和度不为0,因此色相调整可以正常生效。
解决方法
你需要先给灰度图像的非透明像素叠加基础饱和度,再调整色相、亮度等参数,即可实现自定义着色效果,适配你当前的Rectangle+ImagePattern使用场景,修改后的代码如下:
// 加载原灰度图像 Image originGrayImage = new Image("File:resources/images/image.png"); ImagePattern imagePattern = new ImagePattern(originGrayImage); Rectangle rectangle = new Rectangle(); rectangle.setFill(imagePattern); ColorAdjust colorAdjust = new ColorAdjust(); Color targetColor = Color.GREEN; // 关键步骤:先给灰度像素设置和目标色一致的基础饱和度 colorAdjust.setSaturation(targetColor.getSaturation()); // 调整色相,灰度原图不需要额外加180度偏移,直接映射范围即可 double hue = map(targetColor.getHue(), 0, 360, -1, 1); colorAdjust.setHue(hue); // 亮度调整可根据实际显示效果微调 double brightness = map(targetColor.getBrightness(), 0, 1, -1, 0); colorAdjust.setBrightness(brightness); // 若存在半透明像素异常着色问题,可额外叠加Blend效果保证仅非透明区域生效 Blend blend = new Blend(); blend.setTopInput(colorAdjust); blend.setMode(BlendMode.SRC_ATOP); rectangle.setEffect(blend);
内容的提问来源于stack exchange,提问作者Niels
相关产品推荐
相关产品推荐

