Bonjour, je développe une applicaion de visioneuse, et je souhaiterai pouvoir zoomer sur l'image affichée ainsi que de pouvoir me déplacer dedans... Mon problème est quand lorsque j'utilise le zoom, ça redimentionne ma Région au lieux de mon image.. Je vous joint quelques captures d'écran pour vous expliquer :
Nom : 1.JPG
Affichages : 1026
Taille : 89,5 Ko
L'image qui est affichée au début.
Nom : 2.JPG
Affichages : 982
Taille : 65,3 Ko
L'image une fois que j'ai zoomé
Nom : 3.JPG
Affichages : 991
Taille : 66,6 Ko
L'image une fois que j'ai dézoomé.

Le déplacement dans l'image fonctionne mais le zoom je souhaiterai que la zone de l'image reste fixe et que ce soit l'image qui se zoom et pas l'inverse.

J'utilise javaFx, j'ai un fichier FXML qui contient pour la zone d'image, un Pane, qui lui comprend une région et une imageView.

Mon code qui gère le zoom :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
visioneusePrincipal.setImage(image);
                final Rectangle2D viewport = new Rectangle2D(0, 0, 0, 0);
                visioneusePrincipal.setViewport(viewport);
                visioneusePrincipal.setOnMousePressed(this::handleMousePressed);
                visioneusePrincipal.setOnMouseDragged(this::handleMouseDragged);
                visioneusePrincipal.setOnScroll(this::handleZoom);
                visioneusePrincipal.getTransforms().add(scale);
                Platform.runLater(() -> {
                    mapArea.widthProperty().addListener(this::mapAreaSizeChanged);
                    mapArea.heightProperty().addListener(this::mapAreaSizeChanged);
                });
Et les fonctions :

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
 
 private void handleMousePressed(MouseEvent e) {
        startX = e.getX();
        startY = e.getY();
    }
 
    private void handleMouseDragged(MouseEvent e) {
 
        double draggedDistanceX = startX - e.getX();
        double draggedDistanceY = startY - e.getY();
 
        startX = e.getX();
        startY = e.getY();
 
        double viewWidth = mapArea.getWidth() * 1 / zoom;
        double viewHeight = mapArea.getHeight() * 1 / zoom;
 
        final Rectangle2D viewport = visioneusePrincipal.getViewport();
        double curMinX = viewport.getMinX();
        double curMinY = viewport.getMinY();
 
        double newMinX = curMinX + draggedDistanceX;
        double newMinY = curMinY + draggedDistanceY;
        newMinX = clamp(newMinX, 0, Math.max(0, visioneusePrincipal.getImage().getWidth() - viewWidth));
        newMinY = clamp(newMinY, 0, Math.max(0, visioneusePrincipal.getImage().getHeight() - viewHeight));
        visioneusePrincipal.setViewport(new Rectangle2D(newMinX, newMinY, viewWidth, viewHeight));
        System.out.printf("%f x %f \t %f x %f%n", newMinX, newMinY, visioneusePrincipal.getImage().getWidth(), visioneusePrincipal.getImage().getHeight());
    }
 
    double clamp(double min, double value, double max) {
        double result = Math.max(min, value);
        result = Math.min(result, max);
        return result;
    }
 
    private void mapAreaSizeChanged(Observable o) {
        double viewWidth = mapArea.getWidth() * 1 / zoom;
        double viewHeight = mapArea.getHeight() * 1 / zoom;
        final Rectangle2D viewport = visioneusePrincipal.getViewport();
        if (viewport.getWidth() != viewWidth || viewport.getHeight() != viewHeight) {
            double newMinX = viewport.getMinX();
            double newMinY = viewport.getMinY();
            newMinX = clamp(newMinX, 0, Math.max(0, visioneusePrincipal.getImage().getWidth() - viewWidth));
            newMinY = clamp(newMinY, 0, Math.max(0, visioneusePrincipal.getImage().getHeight() - viewHeight));
            visioneusePrincipal.setViewport(new Rectangle2D(newMinX, newMinY, viewWidth, viewHeight));
        }
    }
 
    private double zoom = 1.0;
    private Scale scale = new Scale(zoom, zoom);
    private static final double MIN_ZOOM = 0.5;
    private static final double MAX_ZOOM = 2.0;
 
    private void handleZoom(ScrollEvent event) {
        double delta = event.getDeltaY();
        double newZoom = zoom;
        if (delta < 0) {
            newZoom /= 2;
        }
        if (delta > 0) {
            newZoom *= 2;
        }
        newZoom = clamp(MIN_ZOOM, newZoom, MAX_ZOOM);
        if (newZoom == zoom) {
            return;
        }
        zoom = newZoom;
        System.out.printf("Zoom: %f%n", zoom);
        scale.setX(zoom);
        scale.setY(zoom);
        double viewWidth = mapArea.getWidth() * 1 / zoom;
        double viewHeight = mapArea.getHeight() * 1 / zoom;
        final Rectangle2D viewport = visioneusePrincipal.getViewport();
        if (viewport.getWidth() != viewWidth || viewport.getHeight() != viewHeight) {
            double newMinX = viewport.getMinX();
            double newMinY = viewport.getMinY();
            newMinX = clamp(newMinX, 0, Math.max(0, visioneusePrincipal.getImage().getWidth() - viewWidth));
            newMinY = clamp(newMinY, 0, Math.max(0, visioneusePrincipal.getImage().getHeight() - viewHeight));
            visioneusePrincipal.setViewport(new Rectangle2D(newMinX, newMinY, viewWidth, viewHeight));
        }
    }
Merci beaucoup !