下方为所剪切的图片,点击保存,可以选择一个“.jpg”图片作为保存路径
设计思路:
1、主面板的绘制,就是上方面板
2、点击“屏幕截图”时的监听器设置
2.1、首先隐藏主面板,对后方的屏幕页面进行图片截取操作
2.2、主要设计以及绘制在CaptureFrame ()类,注释已加
package my;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class CaptureFrame extends JFrame
{
MyFrame mainFrame;
BufferedImage image;
public CaptureFrame(MyFrame mainFrame,BufferedImage image)
{
// 设为全屏显示, 全屏后可以按 Windows + D 或 ALT + TAB键 切换到桌面
this.setUndecorated(true);
// 某些电脑不支持这种全屏方式绘制
//GraphicsDevice gd = getGraphicsConfiguration().getDevice();
//gd.setFullScreenWindow(this);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setSize( screenSize );
this.mainFrame=mainFrame;
this.image=image;
//图片操作面板
CapturePanel root=new CapturePanel();
this.setContentPane(root);
}
private class CapturePanel extends JPanel
{
boolean pressed=false;
Point cursorPos; //鼠标截取松开点
Point startPos; //鼠标截取按下点
public CapturePanel()
{
//给本面板添加鼠标事件
MyMouseAdapter mouseAdapter=new MyMouseAdapter();
this.addMouseListener(mouseAdapter);
this.addMouseMotionListener(mouseAdapter);
}
//正确的获取截取区域,不管上下左右怎样拉拽,确保截取区域的正确性
private Rectangle getArea(Point p1,Point p2)
{
int x=p1.x;
int y=p1.y;
int w=p2.x-p1.x;
int h=p2.y-p1.y;
if(w<0)
{
x=p2.x;
w=-w;
}
if(h <0)
{
y = p2.y;
h = -h;
}
return new Rectangle(x,y,w,h);
}
//绘制截取的图片
@Override
protected void paintComponent(Graphics g)
{
int width=getWidth();
int height=getHeight();
Graphics2D g2d = (Graphics2D)g;
// 绘制大背景图片,待操作的图片
if(image != null)
{
g2d.drawImage(image, 0, 0, null);
}
// 参考线
if(cursorPos != null)
{
int cx = (int)cursorPos.getX();
int cy = (int)cursorPos.getY();
g2d.setColor(Color.blue);
g2d.drawLine(0,cy, width, cy);
g2d.drawLine(cx, 0, cx, height);
// 中间画一个小圆圈
Ellipse2D circle = new Ellipse2D.Double(cx-2,cy-2,4,4);
g2d.setPaint(Color.WHITE);
g2d.fill(circle);
g2d.setPaint(Color.gray);
g2d.draw(circle);
}
//绘制截取区域的颜色
if(pressed)
{
Rectangle area = getArea(startPos, cursorPos);
g2d.setPaint(new Color(135 ,206, 250,100)); //....
g2d.fill(area);
}
}
//鼠标事件大集合
private class MyMouseAdapter extends MouseAdapter
{
long lastPaint=0;
@Override
public void mouseMoved(MouseEvent e) //鼠标移动过程
{
cursorPos=e.getPoint();
repaint();
}
@Override
public void mousePressed(MouseEvent e) //初次点击位置
{
if(e.getButton()==MouseEvent.BUTTON1)
{
pressed=true;
cursorPos=startPos=e.getPoint();
}
}
@Override
public void mouseReleased(MouseEvent e) //释放位置
{
if(pressed)
{
pressed=false;
cursorPos=e.getPoint();
//取得图片
CaptureFrame.this.setVisible(false);
Rectangle area=getArea(startPos,cursorPos);
mainFrame.setVisible(true);
mainFrame.showImage(image, area);
}
}
@Override
public void mouseDragged(MouseEvent e) //鼠标点击后拖拽过程
{
if(pressed)
{
long now = System.currentTimeMillis();
// if(now - lastPaint > 100)
{
lastPaint = now;
cursorPos = e.getPoint();
repaint();
}
}
}
}
}
}
package my;
import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.filechooser.FileNameExtensionFilter;
import js.swing.JsImageView;
public class MyFrame extends JFrame
{
//原始图片
BufferedImage srcImage;
//用来显示图片的控件
JsImageView imageView=new JsImageView(); //呈现图片的图片面板
public MyFrame(String title)
{
super(title);
JPanel root=new JPanel();
this.setContentPane(root);
root.setLayout(new BorderLayout());
//设置图片面板
root.add(imageView, BorderLayout.CENTER);
imageView.setBgColor(new Color(0x333333));
imageView.setScaleType(JsImageView.FIT_CENTER_INSIDE);
JButton scaleButton=new JButton("屏幕截图");
scaleButton.addActionListener((e)->{
startCapture();
});
JButton cropButton = new JButton("保存");
cropButton.addActionListener((e) -> {
saveCapture();
});
//工具栏上的按钮
JPanel toolbar=new JPanel();
toolbar.setLayout(new FlowLayout());
toolbar.add(scaleButton);
toolbar.add(cropButton);
root.add(toolbar, BorderLayout.PAGE_START);
}
public void startCapture()
{
this.setVisible(false); //隐藏本窗口
new CaptureThread().start();
}
public void showImage(BufferedImage screenImg, Rectangle area)
{
BufferedImage img = screenImg.getSubimage(area.x, area.y,area.width,area.height);
imageView.setImage(img);
}
//保存
public void saveCapture()
{
BufferedImage img=(BufferedImage)imageView.getImage();
if(img == null) return;
//选择保存路径
JFileChooser chooser=new JFileChooser();
//选择一个jpg图片来保存截图
FileNameExtensionFilter filter=new FileNameExtensionFilter("图片","jpg");
chooser.setFileFilter(filter);
chooser.setCurrentDirectory(new File(".")); //设置默认保存路径
int ret=chooser.showSaveDialog(this);
if(ret==JFileChooser.APPROVE_OPTION);
{
//结果为:用户要保存文件的路径
File file=chooser.getSelectedFile();
String filePath=file.getAbsolutePath();
if(filePath.endsWith(".jpg"))
{
}
else
{
// System.out.println("456");
filePath+=".jpg";
file=new File(filePath);
}
try {
ImageIO.write(img, "jpg", file);
}catch(Exception e)
{
e.printStackTrace();
}
}
}
//抓取屏幕
private void captureScreen()
{
BufferedImage snapshot=null;
try
{
//获取屏幕的尺寸
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
//屏幕截图
Robot robot=new Robot();
snapshot=robot.createScreenCapture(new Rectangle(screenSize)); //截取整个屏幕图像
// ImageIO.write(snapshot, "PNG", new File("scree.png"));
} catch (AWTException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// setVisible(true); //恢复显示本窗口
CaptureFrame otherFrame=new CaptureFrame(this,snapshot);
otherFrame.setVisible(true);
}
private class CaptureThread extends Thread
{
@Override
public void run()
{
//等待窗口隐藏后再实施抓图
//因为setVisible(false)并不是一瞬间隐藏的,需要一点时间
try {
sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SwingUtilities.invokeLater(()->{
captureScreen();
});
}
}
}
package my;
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Demo
{
private static void createGUI()
{
// JFrame指一个窗口,构造方法的参数为窗口标题
// 语法:因为MyFrame是JFrame的子类,所以可以这么写
JFrame frame = new MyFrame("Js截图");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置窗口的其他参数,如窗口大小
frame.setSize(800, 500);
// 显示窗口
frame.setVisible(true);
}
public static void main(String[] args)
{
//设置界面样式 Look And Feel
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException
| UnsupportedLookAndFeelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run()
{
createGUI();
}
});
}
}
还有两个自定义的图片处理类
需要的留话 0.0