2017-05-12 1 views
0

Contexte: Traitement v3; Windows 10Se déplacer dans une image plus grande que l'écran

J'ai une image de 853x2048 pixels que je veux afficher en taille réelle sur l'écran. Une grande partie disparaîtra du fond. Je veux utiliser Processing pour naviguer à l'intérieur de l'image, faire un mouvement, faire une pause à certains endroits et aussi zoomer et dézoomer.

Le code ci-dessous est adapté d'une démo de la classe Robot car je pensais que ce serait le moment de se déplacer à l'intérieur de l'image.

Ce code fonctionne mais je n'arrive pas encore à comprendre comment déplacer la fenêtre. Et puis il y a le problème du zoom (que je n'ai pas encore abordé.)

Comment déplacer la souris pour déplacer l'image ou comment déplacer l'image par rapport à la fenêtre d'affichage?

// 
// how to use java.awt.Robot class in processing ... 
// 
import java.awt.*; 
import java.awt.event.*; 

Robot robot; 
PFont pfont; 
Point save_p; 
PImage img; 

void setup() { 
    try { 
    robot = new Robot(); 
    robot.setAutoDelay(0); 
    } 
    catch (Exception e) { 
    e.printStackTrace(); 
    } 
    surface.setResizable(true); 
    fullScreen(); 
    img = loadImage("bigpic.jpg"); 
    pfont = createFont("Impact", 32); 
} 

void draw() { 
    background(#ffffff); 
    fill(#000000); 

    imageMode(CORNERS); 
    image(img, 0, 0, 640*3, 480*8); 

    Point p = getGlobalMouseLocation(); 

    textFont(pfont); 
    text("now x=" + (int)p.getX() + ", y=" + (int)p.getY(), 10, 32); 

    if (save_p != null) { 
    text("save x=" + (int)save_p.getX() + ", y=" + (int)save_p.getY(), 10, 64); 
    } 
} 

void keyPressed() { 
    switch(key) { 
    case 's': 
    save_p = getGlobalMouseLocation(); 
    break; 
    case 'm': 
    if (save_p != null) { 
     mouseMove((int)save_p.getX(), (int)save_p.getY()); 
    } 
    break; 
    case 'c': 
    break; 
    case 't': 
    translate(2000, 0); 
    break; 
    case ' ': 
    if (save_p != null) { 
     mouseMoveAndClick((int)save_p.getX(), (int)save_p.getY()); 
    } 
    break; 
    } 
} 

Point getGlobalMouseLocation() { 
    // java.awt.MouseInfo 
    PointerInfo pointerInfo = MouseInfo.getPointerInfo(); 
    Point p = pointerInfo.getLocation(); 
    return p; 
} 

void mouseMove(int x, int y) { 
    robot.mouseMove(x, y); 
} 

void mouseMoveAndClick(int x, int y) { 
    robot.mouseMove(x, y); 
    robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); 
    robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); 
    robot.waitForIdle(); 
} 
+0

@KevinWorkman, Nous avons fini par suivre un chemin complètement différent à la fin. Nous voulions être en mesure d'appeler une page Web, puis utiliser les touches pour naviguer vers des emplacements prédéfinis, zoom avant et arrière etc, comme technique de présentation. Nous avons tout d'abord pensé à utiliser PhantomJS pour prendre une capture d'écran en mode plein écran et avoir ensuite Processing en navigation. Nous nous sommes retrouvés avec javascript dans un navigateur. – bugmagnet

Répondre

1

Je suis un peu confus par ce que vous faites avec la classe Robot.

Mais dans tous les cas, ce que vous voulez faire est de dessiner l'image afin que sa valeur Y soit plus basse, ce qui fera monter l'image pour que vous puissiez en voir plus. Voici un petit exemple:

PImage img; 
float imageY = 0; 

void setup() { 
    img = loadImage("bigpic.jpg"); 
} 

void draw() { 
    image(img, 0, imageY); 
    imageY--; 
} 

Vous pouvez faire quelque chose de similaire avec le redimensionnement, juste en passant plus de paramètres à la fonction image().

Mais il semble que ce que vous cherchez vraiment sont les fonctions de transformation. Voir le transformer la section de the Processing reference pour plus d'informations, mais fondamentalement vous appelleriez la fonction translate() pour déplacer l'origine. Vous pouvez également appeler la fonction scale() pour effectuer un zoom avant ou arrière.

Voici un petit exemple qui se déplace autour d'un rectangle au lieu d'une image:

void setup(){ 
    size(500, 500); 
} 

void draw(){ 
    background(64); 
    translate(-mouseX, -mouseY); 
    rect(0, 0, width, height); 
} 

Ne pas oublier que le traitement est livré avec une tonne d'exemples. Dans l'éditeur de traitement, passez à File > Examples.