-31%
Le deal à ne pas rater :
Promo sur les baskets Nike React Element 55 SE pour homme
90 € 130 €
Voir le deal

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

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