Impression d'écran avec sélection de zone
Page 1 sur 1
Impression d'écran avec sélection de zone
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
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);
}
}
}
Sujets similaires
» Impression d'écran avec incrustation du curseur de la souris
» Doter une JTable d'une sélection instantanée sur les lignes
» Doter une JTable d'une sélection instantanée sur les cellules
» Doter une JList d'une sélection instantanée sur les lignes
» Impression d'écran pour la fenêtre active
» Doter une JTable d'une sélection instantanée sur les lignes
» Doter une JTable d'une sélection instantanée sur les cellules
» Doter une JList d'une sélection instantanée sur les lignes
» Impression d'écran pour la fenêtre active
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|
Mar 16 Sep - 12:01 par Gus
» Présentation du jeu Vindinium
Jeu 20 Fév - 15:32 par Gus
» Rechercher la cible la plus proche avec le "Breadth First Search"
Jeu 20 Fév - 13:06 par Gus
» Impression d'écran avec sélection de zone
Jeu 20 Fév - 12:12 par Gus
» Envoyer un mail par un compte Gmail
Jeu 25 Avr - 14:04 par Gus
» Streaming : comment télécharger les vidéos
Lun 4 Fév - 19:59 par Gus
» Synology : installer ipkg
Mar 22 Jan - 21:22 par Gus
» Trouver le type de lecteur avec JNA
Mer 9 Jan - 23:11 par Gus
» Adresse ip publique et adresse ip privée, Internet box et UPnP
Mer 9 Jan - 21:02 par Gus
» Accéder au numéro de série du lecteur par un script vb
Mer 9 Jan - 19:31 par Gus