1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
| package image.filter.bw;
import javafx.embed.swing.SwingFXUtils;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.SplitPane;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.BorderPane;
import javafx.stage.FileChooser;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
/**
* @author L540
*/
public class FXMLDocumentController {
//id de imageView pour scene builder
@FXML
private ImageView imageView;
//id de boderPane pour scene builder
@FXML
private BorderPane borderPane;
//id de label pour scene builder
@FXML
private Label name;
@FXML
private SplitPane splitPane;
@FXML
private ImageView imageView2;
//image acutuelle
private Image currentImage;
//rotation acctuelle
private int currentRotation = 0;
// Variables pour le mouvement de la souris
private double mouseDragEnteredX;
private double mouseDragEnteredY;
// Zoom arrière/avant avec ces valeurs
private double zoomInMultiplier = 1.2;
private double zoomOutMultiplier = 0.55;
//degré de rotation
private int rotateDegree = 25;
//avoir une image
@FXML
public void openImage(Event event) {
File file;
FileChooser fileChooser = new FileChooser();
// L'utilisateur sélectionne un fichier de la boite de dialogue
file = fileChooser.showOpenDialog(borderPane.getScene().getWindow());
if (file == null) {
return;
}
/* currentRotation = 0;
imageView.setRotate(currentRotation);*/
currentImage = new Image(file.toURI().toString());
final int pixelWidth = (int) currentImage.getWidth();
final int pixelHeight = (int) currentImage.getHeight();
// current dans c'est l'image vas etre mis dans l'imageViwer de scene builder
imageView.setImage(currentImage);
/* imageView.setViewport(new Rectangle2D(0,0,currentImage.getWidth(), currentImage.getHeight()));*/
//ajustrer l'image selon sa largeur et sa longueur
imageView.setFitHeight(pixelHeight);
imageView.setFitWidth(pixelWidth);
//mettre le nom de l'image dans le Label decrit par un id -->name
name.setText(file.getName());
imageView2.setFitHeight(pixelHeight);
imageView2.setFitWidth(pixelWidth);
WritableImage image2 = new WritableImage(pixelWidth, pixelHeight);
final var source = currentImage.getPixelReader();
final var destination = image2.getPixelWriter();
for (int y = 0; y < pixelHeight; y++) {
for (int x = 0; x < pixelWidth; x++) {
final var color = source.getColor(x, y);
int sr = (int) (color.getRed() * 255);
int sg = (int) (color.getGreen() * 255);
int sb = (int) (color.getBlue() * 255);
int sa = (int) (color.getOpacity() * 255);
final int argb = toMonochrome (sr, sg, sb, sa);
destination.setArgb(x, y, argb);
}
}
imageView2.setImage(image2);
}
@FXML
public void saveImage(Event event) {
File file;
FileChooser fileChooser = new FileChooser();
// L'utilisateur sélectionne un fichier de la boite de dialogue
file = fileChooser.showSaveDialog(borderPane.getScene().getWindow());
if (file == null) {
return;
}
final var image = imageView2.getImage();
final var swingImage = SwingFXUtils.fromFXImage(image, null);
try {
ImageIO.write(swingImage, "png", file);
} catch (IOException e) {
e.printStackTrace();
}
}
private final int toGrayScale(int red, int green, int blue, int alpha) {
final int gray = ((int) (0.3 * red + 0.59 * green + 0.11 * blue)) & 0xFF;
final int a = alpha & 0xFF;
final int argb = (a << 24) | (gray << 16) | (gray << 8) | (gray << 0);
return argb;
}
private final int toMonochrome(int red, int green, int blue, int alpha) {
final int gray = (int) (0.3 * red + 0.59 * green + 0.11 * blue);
final int monochrome = (gray < 127) ? 0 : 255;
final int a = alpha & 0xFF;
final int argb = (a << 24) | (monochrome << 16) | (monochrome << 8) | (monochrome << 0);
return argb;
}
//prendre la largeur et longueur de l'image et les multplier par les varriables de ZoomIn pour avoir une nouvelle image decrite selon les valeurs du zoom
@FXML
public void handleZoomIn(Event event) {
imageView.setFitHeight(imageView.getFitHeight() * zoomInMultiplier);
imageView.setFitWidth(imageView.getFitWidth() * zoomInMultiplier);
}
//prendre la largeur et longueur de l'image et les multplier par les varriables de ZoomOut pour avoir une nouvelle image decrite selon les valeurs du zoom
@FXML
public void handleZoomOut(Event event) {
imageView.setFitHeight(imageView.getFitHeight() * zoomOutMultiplier);
imageView.setFitWidth(imageView.getFitWidth() * zoomOutMultiplier);
}
//Gère mouseScrolling sur l'image/Zoom avant si défilement avant && Effectuer un zoom arrière si vous faites défiler vers l'arrière
@FXML
public void handleScrollOnImage(ScrollEvent event) {
if (event.getDeltaY() > 0) {
handleZoomIn(event);
}
if (event.getDeltaY() < 0) {
handleZoomOut(event);
}
}
// Définit la position de limage sur la position de la souris lors du glissement
public void handleMouseDrag(MouseEvent event) {
double changeX = -(mouseDragEnteredX - event.getSceneX());
double changeY = -(mouseDragEnteredY - event.getSceneY());
borderPane.getCenter().setTranslateX(changeX);
borderPane.getCenter().setTranslateY(changeY);
}
// Enregistre la position de la souris puis appuie sur l'image.
// Ceci est fait pour que le changement de position puisse être calculé en faisant glisser l'image
@FXML
public void handleDragEntered(MouseEvent event) {
mouseDragEnteredX = event.getSceneX();
mouseDragEnteredY = event.getSceneY();
}
//l'image vas changé la raotation selon les click faite dans currentRotation vas changer de la valeur 25 avec setRoate
@FXML
public void handleClickLeftRotate(Event event) {
currentRotation += -rotateDegree;
imageView.setRotate(currentRotation);
}
//l'image vas changé la raotation selon les click faite dans currentRotation vas changer de la valeur 25 avec setRoate
@FXML
public void handleClickRightRotate(Event event) {
currentRotation += rotateDegree;
imageView.setRotate(currentRotation);
}
//effacer l'image
@FXML
public void delete(Event event) {
imageView.imageProperty().set(null);
}
} |
Partager