您可以从原始图像中获取PixelReader,您可以使用它来查询各个像素的颜色。
然后您可以创建一个PixelBuffer 并将像素复制到其中,调整任何需要调整的内容。
然后从PixelBuffer 创建一个WritableImage。您甚至可以动态调整像素数据,在缓冲区上调用updateBuffer 以确保图像更新。
这是一个示例,您可以在其中选择一种颜色来替换白色背景:
import java.nio.IntBuffer;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ColorPicker;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.PixelBuffer;
import javafx.scene.image.PixelFormat;
import javafx.scene.image.PixelReader;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class App extends Application {
@Override
public void start(Stage stage) {
Image originalImage = createImage();
ImageView orig = new ImageView(originalImage);
ColorPicker colorPicker = new ColorPicker(Color.BLUE);
int width = (int) originalImage.getWidth();
int height = (int) originalImage.getHeight();
int[] pixels = new int[width * height];
PixelBuffer<IntBuffer> pixelBuffer = new PixelBuffer<IntBuffer>(width, height, IntBuffer.wrap(pixels), PixelFormat.getIntArgbPreInstance());
adjustImage(originalImage, colorPicker.getValue(), pixelBuffer, pixels);
ImageView adjusted = new ImageView(new WritableImage(pixelBuffer));
HBox images = new HBox(5, orig, adjusted);
colorPicker.valueProperty().addListener((obs, oldColor, newColor) -> adjustImage(originalImage, newColor, pixelBuffer, pixels));
HBox controls = new HBox(5, colorPicker);
BorderPane root = new BorderPane(images);
root.setTop(controls);
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
private void adjustImage(Image original, Color newColor, PixelBuffer<IntBuffer> buffer, int[] pixels) {
int alpha = (int)(newColor.getOpacity() * 255) ;
int r = (int)(newColor.getRed() * 255);
int g = (int)(newColor.getGreen() * 255);
int b = (int)(newColor.getBlue() * 255);
int replacement = alpha << 24 | r << 16 | g << 8 | b ;
int width = (int)original.getWidth() ;
int height = (int)original.getHeight();
PixelReader pixelReader = original.getPixelReader() ;
for (int y = 0 ; y < height ; y++) {
for (int x = 0 ; x < width ; x++) {
int argb = pixelReader.getArgb(x, y);
if (argb == 0xFFFFFFFF) {
pixels[x+y*width] = replacement ;
} else {
pixels[x+y*width] = argb ;
}
}
}
buffer.updateBuffer(buff -> null);
}
private Image createImage() {
// In real life here you can just read an image from a resource in the normal way
// This just creates an image on the fly to make the example stand alone
int width = 400 ;
int height = 400 ;
int[] pixels = new int[width*height];
for (int y = 0 ; y < height ; y++) {
for (int x = 0 ; x < width ; x++) {
if ((x-200)*(x-200) + (y-200)*(y-200) < 40000) {
pixels[x+y*width] = 0xffff0000 ;
} else {
pixels[x+y*width] = 0xffffffff ;
}
}
}
return new WritableImage(new PixelBuffer<IntBuffer>(width, height, IntBuffer.wrap(pixels), PixelFormat.getIntArgbPreInstance()));
}
public static void main(String[] args) {
launch();
}
}