JavaFX 控件 ImageView

ImageView

支持格式:
BMP GIF JPEG PNG

//加載圖片
//如果設置了 requestedXXX 尺寸, ImageView中 設置 FitXXX 尺寸是基於requestedXXX 尺寸縮放
Image image = new Image(
        String url,
double requestedWidth,
double requestedHeight,
boolean preserveRatio,
boolean smooth,
boolean backgroundLoading);

Image image = new Image("https://pic.rmb.bdstatic.com/c86255e8028696139d3e3e4bb44c047b.png", 100, 100, true, true, true);
//顯示圖片
ImageView imageView = new ImageView(image);

保持長寬比

ImageView imageView = new ImageView(image);
imageView.setPreserveRatio(true);
imageView.setFitWidth(200);
imageView.setFitHeight(200);

獲取尺寸

Image image = new Image("image/portrait.jpg");
ImageView imageView = new ImageView(image);
imageView.setPreserveRatio(true);

System.out.println(imageView.getFitHeight());//0.0
System.out.println(imageView.getFitWidth());//0.0
//獲取沒有設置尺寸時的實際尺寸
System.out.println(imageView.prefHeight(-1));//391.0
System.out.println(imageView.prefWidth(-1));//391.0

設置圓角

Image image = new Image("image/portrait.jpg");
ImageView imageView = new ImageView(image);
imageView.setPreserveRatio(true);
imageView.setFitWidth(200);

Rectangle rectangle = new Rectangle(imageView.prefWidth(-1), imageView.prefHeight(-1));
rectangle.setArcWidth(50);
rectangle.setArcHeight(50);
imageView.setClip(rectangle);

Viewport

Image image = new Image("image/portrait.jpg");
ImageView imageView = new ImageView(image);
imageView.setPreserveRatio(true);
imageView.setFitWidth(200);

Rectangle2D rectangle = new Rectangle2D(80, 0, 200, 200);
imageView.setViewport(rectangle);

獲取像素 ARGB

PixelReader pixelReader = image.getPixelReader();
int argb = pixelReader.getArgb(66, 66);
int a = (argb >> 24) & 0xff;
int r = (argb >> 16) & 0xff;
int g = (argb >> 8) & 0xff;
int b = argb & 0xff;

PixelReader

Image image = new Image("image/portrait.jpg");
ImageView imageView = new ImageView(image);
imageView.setPreserveRatio(true);
imageView.setFitWidth(200);

PixelReader pixelReader = image.getPixelReader();
//獲取某個像素 ARGB
int argb = pixelReader.getArgb(66, 66);
int a = (argb >> 24) & 0xff;
int r = (argb >> 16) & 0xff;
int g = (argb >> 8) & 0xff;
int b = argb & 0xff;

//a = 255, r = 43, g = 43, b = 41
System.out.println("a = " + a + ", r = " + r + ", g = " + g + ", b = " + b);

//獲取Color對象
Color color = pixelReader.getColor(100, 120);
//0xe74143ff
System.out.println(color.toString());

Label label = new Label("Label");
label.setTextFill(Paint.valueOf("#" + color.toString().substring(2, 8)));

WritableImage

按像素寫入

WritableImage writableImage = new WritableImage(100, 100);
PixelWriter pixelWriter = writableImage.getPixelWriter();
for (int i = 0; i < 100; i++) {
    for (int k = 0; k < 100; k++) {
        pixelWriter.setColor(i, k, Color.RED);
    }
}

ImageView imageView = new ImageView(writableImage);


操作現有圖片

![](https://cdn.jsdelivr.net/gh/luoshuaidev/luoshuaidev.github.io@image/20200525213103.png)

Image image = new Image("image/portrait.jpg");
WritableImage writableImage = new WritableImage(image.getPixelReader(), 60, 0, 200, 200);

PixelWriter pixelWriter = writableImage.getPixelWriter();
for (int i = 0; i < 50; i++) {
    for (int k = 0; k < 50; k++) {
        pixelWriter.setColor(i, k, Color.RED);
    }
}

ImageView imageView = new ImageView(writableImage);

一張圖片寫入另一張圖片

方法 1

Image image1 = new Image("image/image1.png");
Image image2 = new Image("image/image2.png");
WritableImage writableImage = new WritableImage(image1.getPixelReader(), 0, 0, 1000, 600);

PixelWriter pixelWriter = writableImage.getPixelWriter();
PixelReader pixelReader = image2.getPixelReader();

for (int i = 0; i < 500; i++) {
    for (int j = 0; j < 600; j++) {
        Color color = pixelReader.getColor(i, j);
        pixelWriter.setColor(i, j, color);
    }
}

ImageView imageView = new ImageView(writableImage);

方法 2

Image image1 = new Image("image/image1.png");
Image image2 = new Image("image/image2.png");
WritableImage writableImage = new WritableImage(image1.getPixelReader(), 0, 0, 1000, 600);

PixelWriter pixelWriter = writableImage.getPixelWriter();
PixelReader pixelReader = image2.getPixelReader();

WritablePixelFormat<IntBuffer> pixelFormat = PixelFormat.getIntArgbPreInstance();
int[] buffer = new int[1000 / 2 * 600];
pixelReader.getPixels(0, 0, 1000 / 2, 600, pixelFormat, buffer, 0, 1000 / 2);
pixelWriter.setPixels(0, 0, 1000 / 2, 600, pixelFormat, buffer, 0, 1000 / 2);
ImageView imageView = new ImageView(writableImage);

方法 3

Image image1 = new Image("image/image1.png");
Image image2 = new Image("image/image2.png");
WritableImage writableImage = new WritableImage(image1.getPixelReader(), 0, 0, 1000, 600);

PixelWriter pixelWriter = writableImage.getPixelWriter();
PixelReader pixelReader = image2.getPixelReader();

pixelWriter.setPixels(0, 0, 1000 / 2, 600, pixelReader, 0, 0);
ImageView imageView = new ImageView(writableImage);

圖片寫入文件

BufferedImage bufferedImage = SwingFXUtils.fromFXImage(writableImage, null);
ImageIO.write(bufferedImage, "png", new File("D:/image.png"));

截圖 Node.snapshot()

Image image = new Image("image/portrait.jpg");
ImageView imageView = new ImageView(image);

WritableImage snapshot = imageView.snapshot(null, null);
BufferedImage bufferedImage = SwingFXUtils.fromFXImage(snapshot, null);
ImageIO.write(bufferedImage, "png", new File("D:/image.png"));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章