解决方案
将ColorAdjust效果应用到效果链中的Lighting效果。
无论您做什么,照明效果都会在一定程度上改变图像的外观和颜色(因为这就是照明所做的),但是通过应用额外的颜色调整,您可以获得可以识别的非常接近的图像原色。
如果您需要调整图像的形状,请对剪裁的图像进行快照并将效果应用于快照(如果这是您想要的),如对 ImageView 上的 Border-Radius 和阴影的回答中所述。
例子
// increase brightness and contrast.
ColorAdjust brightLight = new ColorAdjust(0, 0, .25, 0.25);
// chain in your lighting effect.
brightLight.setInput(lighting);
// apply the chained effect to your image.
ImageView litAdjusted = new ImageView(image);
litAdjusted.setEffect(brightLight);
可执行样本

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.effect.*;
import javafx.scene.image.*;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.text.TextAlignment;
import javafx.stage.Stage;
// Java 8 code
public class HereBeDragons extends Application {
@Override public void start(final Stage stage) {
Image image = new Image(imageLoc);
Image clipImage = new Image(CLIP_IMAGE_LOC);
ImageView plain = new ImageView(image);
ImageView lit = new ImageView(image);
Lighting lighting = createLighting();
lit.setEffect(lighting);
ImageView litAdjusted = new ImageView(image);
ColorAdjust brightLight = new ColorAdjust(0, 0, .25, 0.25);
brightLight.setInput(lighting);
litAdjusted.setEffect(brightLight);
plain.setClip(new ImageView(clipImage));
SnapshotParameters params = new SnapshotParameters();
params.setFill(Color.TRANSPARENT);
WritableImage clippedImage = plain.snapshot(params, null);
ImageView litAdjustedClip = new ImageView(clippedImage);
litAdjustedClip.setEffect(brightLight);
plain.setClip(null);
HBox layout = new HBox(
10,
new CaptionedImage(plain, "Plain"),
new CaptionedImage(lit, "Lit"),
new CaptionedImage(litAdjusted, "Lit and Adjusted"),
new CaptionedImage(litAdjustedClip, "Clipped,\nLit and Adjusted")
);
layout.setPadding(new Insets(20));
layout.setStyle("-fx-background-color: lightblue;");
stage.setTitle("Here be Dragons");
stage.setScene(new Scene(layout, Color.LIGHTBLUE));
stage.setResizable(false);
stage.show();
}
private Lighting createLighting() {
// Create ambient light
Light.Distant light = new Light.Distant();
light.setAzimuth(-135.0);
// Create lighting effect
Lighting lighting = new Lighting();
lighting.setLight(light);
lighting.setSurfaceScale(4.0);
return lighting;
}
private class CaptionedImage extends Label {
public CaptionedImage(ImageView imageView, String caption) {
setText(caption);
setGraphic(imageView);
setContentDisplay(ContentDisplay.TOP);
setTextAlignment(TextAlignment.CENTER);
setStyle(
"-fx-text-fill: midnightblue; " +
"-fx-font-size: 16px; " +
"-fx-font-family: palatino; " +
"-fx-font-style: italic;"
);
}
}
public static void main(String[] args) {
launch(args);
}
private static final String imageLoc =
"http://icons.iconarchive.com/icons/custom-icon-design/round-world-flags/128/Wales-icon.png";
// icon license: Free for non-commercial use.
// Buy commercial license here:
// http://www.customicondesign.com/free-icons/flag-icon-set/flat-round-world-flag-icon-set
private static final String CLIP_IMAGE_LOC =
"http://icons.iconarchive.com/icons/gpritiranjan/simple-christmas/128/star-icon.png";
// star icon license: freeware, commercial usage allowed.
}