Java-屏幕截图工具

 下方为所剪切的图片,点击保存,可以选择一个“.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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值