IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

ajout de nom et d'effet noir et blanc sur une image


Sujet :

JavaFX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    étudiant
    Inscrit en
    Février 2018
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : Algérie

    Informations professionnelles :
    Activité : étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2018
    Messages : 91
    Par défaut ajout de nom et d'effet noir et blanc sur une image
    Bonsoir je suis débutante en javaFX et mon problème c'est d'ajouter le nom de l'image qu'on ajouter avec la methode openImage dans notre scene (image+son nom) et plus ajouter un filtre pour qu'elle devient noir et blanc en la sauvegardent et merci d'avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
     
    package tp2;
     
    import java.io.File;
    import java.net.URL;
    import java.util.ResourceBundle;
    import javafx.event.ActionEvent;
    import javafx.event.Event;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.geometry.Rectangle2D;
    import javafx.scene.control.Label;
    import javafx.scene.image.Image;
    import javafx.scene.image.ImageView;
    import javafx.scene.input.MouseEvent;
    import javafx.scene.input.ScrollEvent;
    import javafx.scene.layout.BorderPane;
    import javafx.stage.FileChooser;
     
    /**
     *
     * @author L540
     */
     
    public class FXMLDocumentController  {
        private Image currentImage;
        private int currentRotation = 0;
     
        @FXML ImageView imageView;
        @FXML BorderPane borderPane;
     
        @FXML
        private Label label;
     
     
        private double zoomInMultiplier = 1.15;
        private double zoomOutMultiplier = 0.85;
     
     
          //Variables for mouse movement.
        private double mouseDragEnteredX;
        private double mouseDragEnteredY;
     
            private int rotateDegree = 30; //Degrees to rotate;
     
     
     
         @FXML public void openImage(Event event) {
            File file;
            FileChooser fileChooser = new FileChooser();
            file = fileChooser.showOpenDialog(null); //User selects file from explorer.
            currentRotation = 0; //new image will load in straight.
            imageView.setRotate(currentRotation);
            currentImage = new Image(file.toURI().toString());
            imageView.setImage(currentImage);
            imageView.setViewport(new Rectangle2D(0,0,currentImage.getWidth(), currentImage.getHeight()));
            imageView.setFitHeight(currentImage.getHeight());
            imageView.setFitWidth(currentImage.getWidth());
            TP2.getStage().setTitle(file.getName()); //sets filename as window title.
        }
     
          @FXML public void handleZoomIn(Event event) {
     
            imageView.setFitHeight(imageView.getFitHeight()*zoomInMultiplier);
            imageView.setFitWidth(imageView.getFitWidth()*zoomInMultiplier);
        }
     
        @FXML public void handleZoomOut(Event event) {
            imageView.setFitHeight(imageView.getFitHeight()*zoomOutMultiplier);
            imageView.setFitWidth(imageView.getFitWidth()*zoomOutMultiplier);
        }
     
     
     
     
     
        @FXML public void handleScrollOnImage(ScrollEvent event) {
            if(event.getDeltaY() > 0){ //scrolling forward
                handleZoomIn(event);
            }
            if(event.getDeltaY() < 0){//scrolling backward
                handleZoomOut(event);
            }
        }
     
        public void handleMouseDrag(MouseEvent event) {
            double changeX = -(mouseDragEnteredX- event.getSceneX());
            double changeY = -(mouseDragEnteredY- event.getSceneY());
            borderPane.getCenter().setTranslateX(changeX);
            borderPane.getCenter().setTranslateY(changeY);
        }
     
     
        @FXML public void handleDragEntered(MouseEvent event) {
            mouseDragEnteredX = event.getSceneX();
            mouseDragEnteredY = event.getSceneY();
        }  
     
        @FXML public void handleClickLeftRotate(Event event) {
            currentRotation += -rotateDegree;
            imageView.setRotate(currentRotation);
        }
     
     
        @FXML public void handleClickRightRotate(Event event) {
            currentRotation += rotateDegree;
            imageView.setRotate(currentRotation);
        }
        @FXML public void delete(Event event){
            imageView.imageProperty().set(null);
     
     
    }
    }

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    Un truc comme ca pourrait faire l'affaire meme si c'est pas tres optimise (il faudra faire la conversion et la sauvegarde dans des taches de fond pour eviter de bloquer l'UI lors du traitement de tres grosses images).
    Egalement vu que c'etait pas clair dans ta queston si tu voulais du niveau de gris ou du monochrome je t'ai mi les deux.

    PS : la prochaine fois penser a metre plus de code (nottament le FXML) pour eviter que je retape tout a mano.

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    <?xml version="1.0" encoding="UTF-8"?>
     
    <?import javafx.scene.control.*?>
    <?import javafx.scene.image.ImageView?>
    <?import javafx.scene.layout.BorderPane?>
    <?import javafx.scene.layout.VBox?>
    <BorderPane fx:controller="image.filter.bw.FXMLDocumentController" xmlns:fx="http://javafx.com/fxml" fx:id="borderPane"
                minWidth="800" minHeight="800">
        <center>
            <SplitPane fx:id="splitPane">
                <items>
                    <ScrollPane>
                        <content>
                            <ImageView fx:id="imageView"/>
                        </content>
                    </ScrollPane>
                    <ScrollPane>
                        <content>
                            <ImageView fx:id="imageView2"/>
                        </content>
                    </ScrollPane>
                </items>
            </SplitPane>
        </center>
        <bottom>
            <Label fx:id="name"/>
        </bottom>
        <left>
            <VBox fillWidth="true" spacing="3">
                <children>
                    <Button fx:id="openButton" text="Open" onAction="#openImage" maxWidth="Infinity"/>
                    <Button fx:id="zoomInButton" text="+" onAction="#handleZoomIn" maxWidth="Infinity"/>
                    <Button fx:id="zoonOutButton" text="-" onAction="#handleZoomOut" maxWidth="Infinity"/>
                    <Button fx:id="deleteButton" text="Delete" onAction="#delete" maxWidth="Infinity"/>
                    <Button fx:id="saveButton" text="Save" onAction="#saveImage" maxWidth="Infinity"/>
                </children>
            </VBox>
        </left>
    </BorderPane>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    package image.filter.bw;
     
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.stage.Stage;
     
    /**
     * @author L540
     */
     
    public final class Main extends Application {
     
        public static void main(final String... args) throws Exception {
            launch(args);
        }
     
        @Override
        public void start(final Stage stage) throws Exception {
            final var fxmlURL = getClass().getResource("FXMLDocument.fxml");
            final var fxmlLoader = new FXMLLoader(fxmlURL);
            final Parent root = fxmlLoader.load();
            final var scene = new Scene(root);
            stage.setTitle("Test");
            stage.setScene(scene);
            stage.show();
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 l’image 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);
        }
     
     
    }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre confirmé
    Femme Profil pro
    étudiant
    Inscrit en
    Février 2018
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : Algérie

    Informations professionnelles :
    Activité : étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2018
    Messages : 91
    Par défaut
    mais pour quoi final var ça ne marche pas chez moi ?

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 096
    Par défaut
    Probablement parce que tu utilises un très vieille version de java.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Femme Profil pro
    étudiant
    Inscrit en
    Février 2018
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 25
    Localisation : Algérie

    Informations professionnelles :
    Activité : étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2018
    Messages : 91
    Par défaut
    Citation Envoyé par wax78 Voir le message
    Probablement parce que tu utilises un très vieille version de java.
    j'ai netBean 8.0.2 et jdk8

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    var est une syntaxe introduite dans le JDK 10. Quand tu rencontre ce mot-cle, et si ta version de Java ne ne supporte pas, tout ce que tu as a faire c'est de le remplacer par le bon type.

    JDK 10+
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final var truc = new Toto();
    JDK 1-9
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final Toto truc = new Toto();
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Changer le "Nom de l'image" dans l'onglet processu
    Par Thomas1434 dans le forum Windows
    Réponses: 1
    Dernier message: 24/02/2006, 04h07
  2. Réponses: 2
    Dernier message: 09/02/2006, 11h42
  3. [MySQL] Nom de l'image stocké dans la base de donnée
    Par ToxiZz dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 07/01/2006, 16h54
  4. [javascript]Récupérer le nom d'une image
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/10/2005, 13h56
  5. [Debutant] Récupérer le nom d'une image
    Par Djoul dans le forum Débuter
    Réponses: 4
    Dernier message: 30/05/2005, 09h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo