From b508c42debdb7be154e221204babd5b2e338928f Mon Sep 17 00:00:00 2001 From: Remizov Kirirll Date: Tue, 4 Mar 2025 12:04:50 +0300 Subject: [PATCH] added inversion filter --- .../example/lab_1/ImageEditorController.java | 42 ++++++++++++++++--- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/lab_1/src/main/java/org/example/lab_1/ImageEditorController.java b/lab_1/src/main/java/org/example/lab_1/ImageEditorController.java index 78273cd..8b01110 100644 --- a/lab_1/src/main/java/org/example/lab_1/ImageEditorController.java +++ b/lab_1/src/main/java/org/example/lab_1/ImageEditorController.java @@ -3,6 +3,9 @@ package org.example.lab_1; import javafx.fxml.FXML; import javafx.scene.image.Image; import javafx.scene.image.ImageView; +import javafx.scene.image.PixelReader; +import javafx.scene.image.PixelWriter; +import javafx.scene.image.WritableImage; import javafx.scene.control.ProgressBar; import javafx.stage.FileChooser; import javafx.stage.Stage; @@ -16,7 +19,7 @@ public class ImageEditorController { private ProgressBar progressBar; public void initialize() { - // Устанавливаем изображение по умолчанию из URL + progressBar.setVisible(false); String imageUrl = "https://s0.rbk.ru/v6_top_pics/media/img/7/15/756775857541157.jpg"; Image defaultImage = new Image(imageUrl); imageView.setImage(defaultImage); @@ -32,14 +35,43 @@ public class ImageEditorController { if (selectedFile != null) { Image image = new Image(selectedFile.toURI().toString()); imageView.setImage(image); - } else { - Image stImage = new Image(""); } } public void applyInversionFilter() { - // Здесь будет логика для применения фильтра инверсии - // Пока просто выводим сообщение + progressBar.setVisible(true); + Image image = imageView.getImage(); + if (image == null) return; + + int width = (int) image.getWidth(); + int height = (int) image.getHeight(); + + WritableImage invertedImage = new WritableImage(width, height); + PixelReader pixelReader = image.getPixelReader(); + PixelWriter pixelWriter = invertedImage.getPixelWriter(); + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + int argb = pixelReader.getArgb(x, y); + + int a = (argb >> 24) & 0xFF; + int r = (argb >> 16) & 0xFF; + int g = (argb >> 8) & 0xFF; + int b = argb & 0xFF; + + // Invert colors + r = 255 - r; + g = 255 - g; + b = 255 - b; + + // Reassemble ARGB + int invertedArgb = (a << 24) | (r << 16) | (g << 8) | b; + pixelWriter.setArgb(x, y, invertedArgb); + } + } + + imageView.setImage(invertedImage); System.out.println("Применен фильтр инверсии"); + progressBar.setVisible(false); } }