Impression d'écran avec sélection de zone

Aller en bas

Impression d'écran avec sélection de zone Empty Impression d'écran avec sélection de zone

Message  Gus le Jeu 20 Fév - 12:12

Une impression d'écran avec sélection de zone, c'est la possibilité de faire un "print screen" en choisissant à la volée la zone qui nous intéresse. Le principe consiste à utiliser un JDialog modal qui va renvoyer un objet BufferedImage correspondant à la zone sélectionnée.

Voici ce que ça donne en pratique :


Et voici le code source qui permet d'obtenir ce résultat :
entité gus.image.printscreen.selectedarea2

Code:
package gus05.entity.gus.image.printscreen.selectedarea2;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Area;
import java.awt.image.BufferedImage;

import javax.swing.JDialog;
import javax.swing.JPanel;

import gus05.framework.core.Entity;
import gus05.framework.features.Provide;


public class PrintScreenSelectedArea2 implements Entity, Provide, MouseListener, MouseMotionListener, KeyListener {


    public String getName() {return "gus.image.printscreen.selectedarea2";}
    public String getCreationDate() {return "2014.02.17";}

    public static final long WAIT = 1000;
    

    private JDialog dialog;
    private JPanel1 panel;
    
    private Rectangle screenRect;
    private Rectangle selectedRect;
    
    private Robot robot;
    private BufferedImage image;
    private BufferedImage result;
    
    private Point start;
    
    

    public PrintScreenSelectedArea2() throws Exception
    {
        screenRect = getScreenRect();
     robot = new Robot();
    
    panel = new JPanel1();
     panel.addMouseListener(this);
     panel.addMouseMotionListener(this);
     panel.addKeyListener(this);
    
    panel.setFocusable(true);
    
    dialog = new JDialog();
     dialog.setModal(true);
     dialog.setContentPane(panel);
     dialog.setBounds(screenRect);
     dialog.setUndecorated(true);
     dialog.setResizable(false);
    }


    public Object provide() throws Exception
    {
     start = null;
     selectedRect = null;
     result = null;
    
    try{Thread.sleep(WAIT);}
     catch(InterruptedException e){}
    
    image = robot.createScreenCapture(screenRect);
     panel.requestFocus();
     dialog.setVisible(true);
    
       return result;
    }
    
    
    private Rectangle getScreenRect()
    {
     GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
     GraphicsDevice device = env.getDefaultScreenDevice();
     GraphicsConfiguration gc = device.getDefaultConfiguration();
     return gc.getBounds();
    }
    
    
    
    private Rectangle getSelectedRect(Point end)
    {
     if(start==null) return null;
    
    int x = Math.min(start.x,end.x);
     int y = Math.min(start.y,end.y);
     int w = Math.abs(start.x-end.x);
     int h = Math.abs(start.y-end.y);
     return new Rectangle(x,y,w,h);
    }
    
    
    
    private void putResult(BufferedImage img)
    {
     result = img;
     dialog.setVisible(false);
    }
    
    private BufferedImage buildResult(Rectangle r)
    {
     if(image==null || r==null) return null;
     return image.getSubimage(r.x,r.y,r.width,r.height);
    }
    
    
    
    
    
 public void mouseDragged(MouseEvent e)
 {
 Point mouse = e.getLocationOnScreen();
 selectedRect = getSelectedRect(mouse);
 panel.repaint();
 }
 



public void mousePressed(MouseEvent e)
 {
 start = e.getLocationOnScreen();
 selectedRect = null;
 }
 

public void mouseReleased(MouseEvent e)
 {
 Point mouse = e.getLocationOnScreen();
 if(start==null || start.equals(mouse)) return;
 
selectedRect = getSelectedRect(mouse);
 putResult(buildResult(selectedRect));
 }
 
public void mouseClicked(MouseEvent e)
 {
 if(e.getClickCount()==2) putResult(image);
 }
 



public void keyPressed(KeyEvent e)
 {
 if(e.getKeyCode()==KeyEvent.VK_ESCAPE) putResult(null);
 }
 




public void keyReleased(KeyEvent e) {}
 public void keyTyped(KeyEvent e) {}
 
public void mouseMoved(MouseEvent e) {}
 public void mouseEntered(MouseEvent e) {}
 public void mouseExited(MouseEvent e) {}
 






private class JPanel1 extends JPanel
 {
 protected void paintComponent(Graphics g)
 {
 Graphics2D g2 = (Graphics2D) g;
 
if(image!=null) g.drawImage(image,0,0,this);
 
Area area = new Area(screenRect);
 if(selectedRect!=null) area.subtract(new Area(selectedRect));
 
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,0.4f));
g2.setColor(Color.BLACK);
 g2.fill(area);
 }
 }
}

Gus
Gus
Admin

Messages : 249
Date d'inscription : 01/09/2009

Voir le profil de l'utilisateur http://www.gus05.com

Revenir en haut Aller en bas

Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum