首页 > 开发 > Java > 正文

java编程实现屏幕截图(截屏)代码总结

2024-07-13 09:56:09
字体:
来源:转载
供稿:网友

这篇文章主要介绍了java编程实现屏幕截图(截屏)代码,结合3个实例总结分析了Java截屏时页面抓取及图片保存的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例总结了常见的java编程实现屏幕截图方法。分享给大家供大家参考,具体如下:

方法一:

 

 
  1. import java.awt.Desktop; 
  2. import java.awt.Dimension; 
  3. import java.awt.Rectangle; 
  4. import java.awt.Robot; 
  5. import java.awt.Toolkit; 
  6. import java.awt.image.BufferedImage; 
  7. import java.io.File; 
  8. import javax.imageio.ImageIO; 
  9. public class CaptureScreen { 
  10. public static void captureScreen(String fileName, String folder) throws Exception { 
  11. Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
  12. Rectangle screenRectangle = new Rectangle(screenSize); 
  13. Robot robot = new Robot(); 
  14. BufferedImage image = robot.createScreenCapture(screenRectangle); 
  15. //保存路径 
  16. File screenFile = new File(fileName); 
  17. if (!screenFile.exists()) { 
  18. screenFile.mkdir(); 
  19. File f = new File(screenFile, folder); 
  20. ImageIO.write(image, "png", f); 
  21. //自动打开 
  22. if (Desktop.isDesktopSupported() 
  23. && Desktop.getDesktop().isSupported(Desktop.Action.OPEN)) 
  24. Desktop.getDesktop().open(f); 
  25. public static void main(String[] args) { 
  26. try { 
  27. captureScreen("e://你好","11.png"); 
  28. catch (Exception e) { 
  29. // TODO Auto-generated catch block 
  30. e.printStackTrace(); 

方法二:

 

 
  1. package com.qiu.util; 
  2. import java.io.*; 
  3. import javax.swing.*; 
  4. import java.awt.*; 
  5. import java.awt.event.*; 
  6. import java.awt.image.*; 
  7. import javax.imageio.*; 
  8. /** 
  9. * 一个简单的屏幕抓图 
  10.  
  11. **/ 
  12. public class ScreenCapture { 
  13. // test main 
  14. public static void main(String[] args) throws Exception { 
  15. String userdir = System.getProperty("user.dir"); 
  16. File tempFile = new File("d:""temp.png"); 
  17. ScreenCapture capture = ScreenCapture.getInstance(); 
  18. capture.captureImage(); 
  19. JFrame frame = new JFrame(); 
  20. JPanel panel = new JPanel(); 
  21. panel.setLayout(new BorderLayout()); 
  22. JLabel imagebox = new JLabel(); 
  23. panel.add(BorderLayout.CENTER, imagebox); 
  24. imagebox.setIcon(capture.getPickedIcon()); 
  25. capture.saveToFile(tempFile); 
  26. capture.captureImage(); 
  27. imagebox.setIcon(capture.getPickedIcon()); 
  28. frame.setContentPane(panel); 
  29. frame.setSize(400, 300); 
  30. frame.show(); 
  31. System.out.println("Over"); 
  32. private ScreenCapture() { 
  33. try { 
  34. robot = new Robot(); 
  35. catch (AWTException e) { 
  36. System.err.println("Internal Error: " + e); 
  37. e.printStackTrace(); 
  38. JPanel cp = (JPanel) dialog.getContentPane(); 
  39. cp.setLayout(new BorderLayout()); 
  40. labFullScreenImage.addMouseListener(new MouseAdapter() { 
  41. public void mouseReleased(MouseEvent evn) { 
  42. isFirstPoint = true
  43. pickedImage = fullScreenImage.getSubimage(recX, recY, recW, 
  44. recH); 
  45. dialog.setVisible(false); 
  46. }); 
  47. labFullScreenImage.addMouseMotionListener(new MouseMotionAdapter() { 
  48. public void mouseDragged(MouseEvent evn) { 
  49. if (isFirstPoint) { 
  50. x1 = evn.getX(); 
  51. y1 = evn.getY(); 
  52. isFirstPoint = false
  53. else { 
  54. x2 = evn.getX(); 
  55. y2 = evn.getY(); 
  56. int maxX = Math.max(x1, x2); 
  57. int maxY = Math.max(y1, y2); 
  58. int minX = Math.min(x1, x2); 
  59. int minY = Math.min(y1, y2); 
  60. recX = minX; 
  61. recY = minY; 
  62. recW = maxX - minX; 
  63. recH = maxY - minY; 
  64. labFullScreenImage.drawRectangle(recX, recY, recW, recH); 
  65. public void mouseMoved(MouseEvent e) { 
  66. labFullScreenImage.drawCross(e.getX(), e.getY()); 
  67. }); 
  68. cp.add(BorderLayout.CENTER, labFullScreenImage); 
  69. dialog.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); 
  70. dialog.setAlwaysOnTop(true); 
  71. dialog.setMaximumSize(Toolkit.getDefaultToolkit().getScreenSize()); 
  72. dialog.setUndecorated(true); 
  73. dialog.setSize(dialog.getMaximumSize()); 
  74. dialog.setModal(true); 
  75. // Singleton Pattern 
  76. public static ScreenCapture getInstance() { 
  77. return defaultCapturer; 
  78. /** 捕捉全屏慕 */ 
  79. public Icon captureFullScreen() { 
  80. fullScreenImage = robot.createScreenCapture(new Rectangle(Toolkit 
  81. .getDefaultToolkit().getScreenSize())); 
  82. ImageIcon icon = new ImageIcon(fullScreenImage); 
  83. return icon; 
  84. /** 捕捉屏幕的一个矫形区域 */ 
  85. public void captureImage() { 
  86. fullScreenImage = robot.createScreenCapture(new Rectangle(Toolkit 
  87. .getDefaultToolkit().getScreenSize())); 
  88. ImageIcon icon = new ImageIcon(fullScreenImage); 
  89. labFullScreenImage.setIcon(icon); 
  90. dialog.setVisible(true); 
  91. /** 得到捕捉后的BufferedImage */ 
  92. public BufferedImage getPickedImage() { 
  93. return pickedImage; 
  94. /** 得到捕捉后的Icon */ 
  95. public ImageIcon getPickedIcon() { 
  96. return new ImageIcon(getPickedImage()); 
  97. /** 
  98. * 储存为一个文件,为PNG格式 
  99.  
  100. * @deprecated replaced by saveAsPNG(File file) 
  101. **/ 
  102. @Deprecated 
  103. public void saveToFile(File file) throws IOException { 
  104. ImageIO.write(getPickedImage(), defaultImageFormater, file); 
  105. /** 储存为一个文件,为PNG格式 */ 
  106. public void saveAsPNG(File file) throws IOException { 
  107. ImageIO.write(getPickedImage(), "png", file); 
  108. /** 储存为一个JPEG格式图像文件 */ 
  109. public void saveAsJPEG(File file) throws IOException { 
  110. ImageIO.write(getPickedImage(), "JPEG", file); 
  111. /** 写入一个OutputStream */ 
  112. public void write(OutputStream out) throws IOException { 
  113. ImageIO.write(getPickedImage(), defaultImageFormater, out); 
  114. // singleton design pattern 
  115. private static ScreenCapture defaultCapturer = new ScreenCapture(); 
  116. private int x1, y1, x2, y2; 
  117. private int recX, recY, recH, recW; // 截取的图像 
  118. private boolean isFirstPoint = true
  119. private BackgroundImage labFullScreenImage = new BackgroundImage(); 
  120. private Robot robot; 
  121. private BufferedImage fullScreenImage; 
  122. private BufferedImage pickedImage; 
  123. private String defaultImageFormater = "png"
  124. private JDialog dialog = new JDialog(); 
  125. /** 显示图片的Label */ 
  126. class BackgroundImage extends JLabel { 
  127. public void paintComponent(Graphics g) { 
  128. super.paintComponent(g); 
  129. g.drawRect(x, y, w, h); 
  130. String area = Integer.toString(w) + " * " + Integer.toString(h); 
  131. g.drawString(area, x + (int) w / 2 - 15, y + (int) h / 2); 
  132. g.drawLine(lineX, 0, lineX, getHeight()); 
  133. g.drawLine(0, lineY, getWidth(), lineY); 
  134. public void drawRectangle(int x, int y, int width, int height) { 
  135. this.x = x; 
  136. this.y = y; 
  137. h = height; 
  138. w = width; 
  139. repaint(); 
  140. public void drawCross(int x, int y) { 
  141. lineX = x; 
  142. lineY = y; 
  143. repaint(); 
  144. int lineX, lineY; 
  145. int x, y, h, w; 

方法三:

因为有最小化到系统托盘,还是需要一张名为bg.gif作为托盘图标,图片应放在同级目录下,否则会空指针异常。

主要的截屏代码部分是:

 

 
  1. Robot ro=new Robot(); 
  2. Toolkit tk=Toolkit.getDefaultToolkit(); 
  3. Dimension di=tk.getScreenSize(); 
  4. Rectangle rec=new Rectangle(0,0,di.width,di.height); 
  5. BufferedImage bi=ro.createScreenCapture(rec); 

(源代码来源于CSDN)

 

 
  1. import java.awt.*; 
  2. import java.awt.datatransfer.DataFlavor; 
  3. import java.awt.datatransfer.Transferable; 
  4. import java.awt.datatransfer.UnsupportedFlavorException; 
  5. import java.awt.event.*; 
  6. import javax.swing.*; 
  7. import java.io.*; 
  8. import javax.imageio.*; 
  9. import java.awt.image.*; 
  10. public class CaptureScreen extends JFrame implements ActionListener{ 
  11. private JButton start,cancel,saveAll; 
  12. private JPanel c; 
  13. private BufferedImage get; 
  14. private JTabbedPane jtp;//一个放置很多份图片 
  15. private int index;//一个一直会递增的索引,用于标认图片 
  16. private JRadioButton java,system;//JAVA界面,系统界面 
  17. /** Creates a new instance of CaptureScreen */ 
  18. public CaptureScreen() { 
  19. super("屏幕截取软件(第三版)"); 
  20. try
  21. UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
  22. }catch(Exception exe){ 
  23. exe.printStackTrace(); 
  24. initWindow(); 
  25. initOther(); 
  26. initTrayIcon(); 
  27. private void initOther(){ 
  28. jtp=new JTabbedPane(JTabbedPane.TOP,JTabbedPane.SCROLL_TAB_LAYOUT); 
  29. private void initWindow(){ 
  30. start=new JButton("开始截取"); 
  31. saveAll=new JButton("保存所有"); 
  32. cancel=new JButton("退出"); 
  33. start.addActionListener(this); 
  34. saveAll.addActionListener(this); 
  35. cancel.addActionListener(this); 
  36. JPanel buttonJP=new JPanel(); 
  37. c=new JPanel(new BorderLayout()); 
  38. c.setBackground(Color.BLACK); 
  39. JLabel jl=new JLabel("屏幕截取",JLabel.CENTER); 
  40. jl.setFont(new Font("黑体",Font.BOLD,40)); 
  41. jl.setForeground(Color.RED); 
  42. c.add(jl,BorderLayout.CENTER); 
  43. buttonJP.add(start); 
  44. buttonJP.add(saveAll); 
  45. buttonJP.add(cancel); 
  46. buttonJP.setBorder(BorderFactory.createTitledBorder("公共操作区")); 
  47. JPanel jp=new JPanel();//放两个单选按钮的面板 
  48. jp.add(java=new JRadioButton("java界面")); 
  49. jp.add(system=new JRadioButton("系统界面",true)); 
  50. java.addActionListener(this); 
  51. system.addActionListener(this); 
  52. jp.setBorder(BorderFactory.createTitledBorder("界面风格")); 
  53. ButtonGroup bg=new ButtonGroup(); 
  54. bg.add(java); 
  55. bg.add(system); 
  56. JPanel all=new JPanel(); 
  57. all.add(jp); 
  58. all.add(buttonJP); 
  59. this.getContentPane().add(c,BorderLayout.CENTER); 
  60. this.getContentPane().add(all,BorderLayout.SOUTH); 
  61. this.setSize(500,400); 
  62. this.setLocationRelativeTo(null); 
  63. this.setVisible(true); 
  64. this.setAlwaysOnTop(true); 
  65. this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
  66. this.addWindowListener(new WindowAdapter(){ 
  67. public void windowClosing(WindowEvent we){ 
  68. CaptureScreen.this.setVisible(false); 
  69. }); 
  70. private void initTrayIcon(){ 
  71. try
  72. SystemTray st=SystemTray.getSystemTray(); 
  73. Image im=ImageIO.read(this.getClass().getResource("bg.gif")); 
  74. PopupMenu pm=new PopupMenu("弹出菜单"); 
  75. pm.add(new MenuItem("关于")).addActionListener(new ActionListener(){ 
  76. public void actionPerformed(ActionEvent ae){ 
  77. JOptionPane.showMessageDialog(CaptureScreen.this,"<html><Font color=red><center><h2>关于</h2></center></Font>" + 
  78. "这是一款纯JAVA的屏幕截取程序<br>在以前的基础上增加了一些常用的功能,<br>" + 
  79. "比如,批量保存,多幅截取,复制到系统粘帖板...<br>" + 
  80. "在使用过程中有任何问题,欢迎联系.<br>" + 
  81. "<Font size=5 color=blue>作者:千里冰封<br>" + 
  82. "<i>QQ:24325142</i><br></Font></html>"); 
  83. }); 
  84. pm.addSeparator(); 
  85. pm.add(new MenuItem("显示主窗口")).addActionListener(new ActionListener(){ 
  86. public void actionPerformed(ActionEvent ae){ 
  87. CaptureScreen.this.setVisible(true); 
  88. }); 
  89. pm.add(new MenuItem("开始截取")).addActionListener(new ActionListener(){ 
  90. public void actionPerformed(ActionEvent ae){ 
  91. doStart(); 
  92. }); 
  93. pm.add(new MenuItem("退出程序")).addActionListener(new ActionListener(){ 
  94. public void actionPerformed(ActionEvent ae){ 
  95. System.exit(0); 
  96. }); 
  97. TrayIcon ti=new TrayIcon(im,"JAVA屏幕截取",pm); 
  98. st.add(ti); 
  99. ti.addActionListener(new ActionListener(){ 
  100. public void actionPerformed(ActionEvent ae){ 
  101. CaptureScreen.this.setVisible(true); 
  102. }); 
  103. }catch(Exception exe){ 
  104. exe.printStackTrace(); 
  105. private void updates(){ 
  106. this.setVisible(true); 
  107. if(get!=null){ 
  108. //如果索引是0,则表示一张图片都没有被加入过, 
  109. //则要清除当前的东西,重新把tabpane放进来 
  110. if(index==0){ 
  111. c.removeAll(); 
  112. c.add(jtp,BorderLayout.CENTER); 
  113. }else{//否则的话,直接对tabpane添加面板就可以了 
  114. //就什么都不用做了 
  115. PicPanel pic=new PicPanel(get); 
  116. jtp.addTab("图片"+(++index),pic); 
  117. jtp.setSelectedComponent(pic); 
  118. SwingUtilities.updateComponentTreeUI(c); 
  119. private void doStart(){ 
  120. try
  121. this.setVisible(false); 
  122. Thread.sleep(500);//睡500毫秒是为了让主窗完全不见 
  123. Robot ro=new Robot(); 
  124. Toolkit tk=Toolkit.getDefaultToolkit(); 
  125. Dimension di=tk.getScreenSize(); 
  126. Rectangle rec=new Rectangle(0,0,di.width,di.height); 
  127. BufferedImage bi=ro.createScreenCapture(rec); 
  128. JFrame jf=new JFrame(); 
  129. Temp temp=new Temp(jf,bi,di.width,di.height); 
  130. jf.getContentPane().add(temp,BorderLayout.CENTER); 
  131. jf.setUndecorated(true); 
  132. jf.setSize(di); 
  133. jf.setVisible(true); 
  134. jf.setAlwaysOnTop(true); 
  135. catch(Exception exe){ 
  136. exe.printStackTrace(); 
  137. /** 
  138. *公共方法,处理保存所有的图片 
  139. */ 
  140. public void doSaveAll(){ 
  141. if(jtp.getTabCount()==0){ 
  142. JOptionPane.showMessageDialog(this,"图片不能为空!!","错误",JOptionPane.ERROR_MESSAGE); 
  143. return
  144. JFileChooser jfc=new JFileChooser("."); 
  145. jfc.addChoosableFileFilter(new GIFfilter()); 
  146. jfc.addChoosableFileFilter(new BMPfilter()); 
  147. jfc.addChoosableFileFilter(new JPGfilter()); 
  148. jfc.addChoosableFileFilter(new PNGfilter()); 
  149. int i=jfc.showSaveDialog(this); 
  150. if(i==JFileChooser.APPROVE_OPTION){ 
  151. File file=jfc.getSelectedFile(); 
  152. String about="PNG"
  153. String ext=file.toString().toLowerCase(); 
  154. javax.swing.filechooser.FileFilter ff=jfc.getFileFilter(); 
  155. if(ff instanceof JPGfilter){ 
  156. about="JPG"
  157. else if(ff instanceof PNGfilter){ 
  158. about="PNG"
  159. }else if(ff instanceof BMPfilter){ 
  160. about="BMP"
  161. }else if(ff instanceof GIFfilter){ 
  162. about="GIF"
  163. if(ext.endsWith(about.toLowerCase())){ 
  164. ext=ext.substring(0,ext.lastIndexOf(about.toLowerCase())); 
  165. //起一个线程去保存这些图片并显示出进度条 
  166. new SaveAllThread(ext,about).setVisible(true); 
  167. //专门用来保存所有图片的线程类,它还要显示出保存的进度条 
  168. private class SaveAllThread extends JDialog implements Runnable{ 
  169. private String name;//文件名头部份 
  170. private String ext;//文件格式 
  171. private JProgressBar jpb;//一个进度条 
  172. private JLabel info;// 一个信息显示条 
  173. private int allTask,doneTask;//所有任务,已完成任务 
  174. public SaveAllThread(String name,String ext){ 
  175. super(CaptureScreen.this,"保存",true); 
  176. this.name=name; 
  177. this.ext=ext; 
  178. initWindow(); 
  179. private void initWindow(){ 
  180. jpb=new JProgressBar(); 
  181. allTask=jtp.getTabCount(); 
  182. jpb.setMaximum(allTask); 
  183. jpb.setMinimum(0); 
  184. jpb.setValue(0); 
  185. jpb.setStringPainted(true); 
  186. setProgressBarString(); 
  187. info=new JLabel("正在保存到:"); 
  188. this.getContentPane().setBackground(Color.CYAN); 
  189. this.add(info,BorderLayout.NORTH); 
  190. this.add(jpb,BorderLayout.SOUTH); 
  191. this.setUndecorated(true); 
  192. this.setSize(300,100); 
  193. this.setLocationRelativeTo(CaptureScreen.this); 
  194. new Thread(this).start(); 
  195. private void setProgressBarString(){ 
  196. jpb.setString(""+doneTask+"/"+allTask); 
  197. public void run(){ 
  198. try
  199. for(int i=0;i<allTask;i++){ 
  200. PicPanel pp=(PicPanel)jtp.getComponentAt(i); 
  201. BufferedImage image=pp.getImage(); 
  202. File f= new File(name+(doneTask+1)+"."+ext.toLowerCase()); 
  203. info.setText("<html><b>正在保存到:</b><br>"+f.toString()+"</html>"); 
  204. ImageIO.write(image,ext,f); 
  205. doneTask++; 
  206. jpb.setValue(doneTask); 
  207. setProgressBarString(); 
  208. Thread.sleep(500); 
  209. JOptionPane.showMessageDialog(this,"保存完毕!!"); 
  210. this.dispose(); 
  211. }catch(Exception exe){ 
  212. exe.printStackTrace(); 
  213. this.dispose(); 
  214. /** 
  215. *公用的处理保存图片的方法 
  216. *这个方法不再私有了 
  217. */ 
  218. public void doSave(BufferedImage get){ 
  219. try
  220. if(get==null){ 
  221. JOptionPane.showMessageDialog(this,"图片不能为空!!","错误",JOptionPane.ERROR_MESSAGE); 
  222. return
  223. JFileChooser jfc=new JFileChooser("."); 
  224. jfc.addChoosableFileFilter(new GIFfilter()); 
  225. jfc.addChoosableFileFilter(new BMPfilter()); 
  226. jfc.addChoosableFileFilter(new JPGfilter()); 
  227. jfc.addChoosableFileFilter(new PNGfilter()); 
  228. int i=jfc.showSaveDialog(this); 
  229. if(i==JFileChooser.APPROVE_OPTION){ 
  230. File file=jfc.getSelectedFile(); 
  231. String about="PNG"
  232. String ext=file.toString().toLowerCase(); 
  233. javax.swing.filechooser.FileFilter ff=jfc.getFileFilter(); 
  234. if(ff instanceof JPGfilter){ 
  235. about="JPG"
  236. if(!ext.endsWith(".jpg")){ 
  237. String ns=ext+".jpg"
  238. file=new File(ns); 
  239. else if(ff instanceof PNGfilter){ 
  240. about="PNG"
  241. if(!ext.endsWith(".png")){ 
  242. String ns=ext+".png"
  243. file=new File(ns); 
  244. }else if(ff instanceof BMPfilter){ 
  245. about="BMP"
  246. if(!ext.endsWith(".bmp")){ 
  247. String ns=ext+".bmp"
  248. file=new File(ns); 
  249. }else if(ff instanceof GIFfilter){ 
  250. about="GIF"
  251. if(!ext.endsWith(".gif")){ 
  252. String ns=ext+".gif"
  253. file=new File(ns); 
  254. if(ImageIO.write(get,about,file)){ 
  255. JOptionPane.showMessageDialog(this,"保存成功!"); 
  256. else 
  257. JOptionPane.showMessageDialog(this,"保存失败!"); 
  258. catch(Exception exe){ 
  259. exe.printStackTrace(); 
  260. /** 
  261. *公共的处理把当前的图片加入剪帖板的方法 
  262. */ 
  263. public void doCopy(final BufferedImage image){ 
  264. try
  265. if(get==null){ 
  266. JOptionPane.showMessageDialog(this,"图片不能为空!!","错误",JOptionPane.ERROR_MESSAGE); 
  267. return
  268. Transferable trans = new Transferable(){ 
  269. public DataFlavor[] getTransferDataFlavors() { 
  270. return new DataFlavor[] { DataFlavor.imageFlavor }; 
  271. public boolean isDataFlavorSupported(DataFlavor flavor) { 
  272. return DataFlavor.imageFlavor.equals(flavor); 
  273. public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { 
  274. if(isDataFlavorSupported(flavor)) 
  275. return image; 
  276. throw new UnsupportedFlavorException(flavor); 
  277. }; 
  278. Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans, null); 
  279. JOptionPane.showMessageDialog(this,"已复制到系统粘帖板!!"); 
  280. }catch(Exception exe){ 
  281. exe.printStackTrace(); 
  282. JOptionPane.showMessageDialog(this,"复制到系统粘帖板出错!!","错误",JOptionPane.ERROR_MESSAGE); 
  283. //处理关闭事件 
  284. private void doClose(Component c){ 
  285. jtp.remove(c); 
  286. c=null
  287. System.gc(); 
  288. public void actionPerformed(ActionEvent ae){ 
  289. Object source=ae.getSource(); 
  290. if(source==start){ 
  291. doStart(); 
  292. else if(source==cancel){ 
  293. System.exit(0); 
  294. }else if(source==java){ 
  295. try
  296. UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); 
  297. SwingUtilities.updateComponentTreeUI(this); 
  298. }catch(Exception exe){ 
  299. exe.printStackTrace(); 
  300. }else if(source==system){ 
  301. try
  302. UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
  303. SwingUtilities.updateComponentTreeUI(this); 
  304. }catch(Exception exe){ 
  305. exe.printStackTrace(); 
  306. }else if(source==saveAll){ 
  307. doSaveAll(); 
  308. //一个内部类,它表示一个面板,一个可以被放进tabpane的面板 
  309. //也有自己的一套处理保存和复制的方法 
  310. private class PicPanel extends JPanel implements ActionListener{ 
  311. JButton save,copy,close;//表示保存,复制,关闭的按钮 
  312. BufferedImage get;//得到的图片 
  313. public PicPanel(BufferedImage get){ 
  314. super(new BorderLayout()); 
  315. this.get=get; 
  316. initPanel(); 
  317. public BufferedImage getImage(){ 
  318. return get; 
  319. private void initPanel(){ 
  320. save=new JButton("保存(S)"); 
  321. copy=new JButton("复制到剪帖板(C)"); 
  322. close=new JButton("关闭(X)"); 
  323. save.setMnemonic('S'); 
  324. copy.setMnemonic('C'); 
  325. close.setMnemonic('X'); 
  326. JPanel buttonPanel=new JPanel(); 
  327. buttonPanel.add(copy); 
  328. buttonPanel.add(save); 
  329. buttonPanel.add(close); 
  330. JLabel icon=new JLabel(new ImageIcon(get)); 
  331. this.add(new JScrollPane(icon),BorderLayout.CENTER); 
  332. this.add(buttonPanel,BorderLayout.SOUTH); 
  333. save.addActionListener(this); 
  334. copy.addActionListener(this); 
  335. close.addActionListener(this); 
  336. public void actionPerformed(ActionEvent e) { 
  337. Object source=e.getSource(); 
  338. if(source==save){ 
  339. doSave(get); 
  340. }else if(source==copy){ 
  341. doCopy(get); 
  342. }else if(source==close){ 
  343. get=null
  344. doClose(this); 
  345. //保存BMP格式的过滤器 
  346. private class BMPfilter extends javax.swing.filechooser.FileFilter{ 
  347. public BMPfilter(){ 
  348. public boolean accept(File file){ 
  349. if(file.toString().toLowerCase().endsWith(".bmp")|| 
  350. file.isDirectory()){ 
  351. return true
  352. else 
  353. return false
  354. public String getDescription(){ 
  355. return "*.BMP(BMP图像)"
  356. //保存JPG格式的过滤器 
  357. private class JPGfilter extends javax.swing.filechooser.FileFilter{ 
  358. public JPGfilter(){ 
  359. public boolean accept(File file){ 
  360. if(file.toString().toLowerCase().endsWith(".jpg")|| 
  361. file.isDirectory()){ 
  362. return true
  363. else 
  364. return false
  365. public String getDescription(){ 
  366. return "*.JPG(JPG图像)"
  367. //保存GIF格式的过滤器 
  368. private class GIFfilter extends javax.swing.filechooser.FileFilter{ 
  369. public GIFfilter(){ 
  370. public boolean accept(File file){ 
  371. if(file.toString().toLowerCase().endsWith(".gif")|| 
  372. file.isDirectory()){ 
  373. return true
  374. else 
  375. return false
  376. public String getDescription(){ 
  377. return "*.GIF(GIF图像)"
  378. //保存PNG格式的过滤器 
  379. private class PNGfilter extends javax.swing.filechooser.FileFilter{ 
  380. public boolean accept(File file){ 
  381. if(file.toString().toLowerCase().endsWith(".png")|| 
  382. file.isDirectory()){ 
  383. return true
  384. else 
  385. return false
  386. public String getDescription(){ 
  387. return "*.PNG(PNG图像)"
  388. //一个暂时类,用于显示当前的屏幕图像 
  389. private class Temp extends JPanel implements MouseListener,MouseMotionListener{ 
  390. private BufferedImage bi; 
  391. private int width,height; 
  392. private int startX,startY,endX,endY,tempX,tempY; 
  393. private JFrame jf; 
  394. private Rectangle select=new Rectangle(0,0,0,0);//表示选中的区域 
  395. private Cursor cs=new Cursor(Cursor.CROSSHAIR_CURSOR);//表示一般情况下的鼠标状态 
  396. private States current=States.DEFAULT;// 表示当前的编辑状态 
  397. private Rectangle[] rec;//表示八个编辑点的区域 
  398. //下面四个常量,分别表示谁是被选中的那条线上的端点 
  399. public static final int START_X=1; 
  400. public static final int START_Y=2; 
  401. public static final int END_X=3; 
  402. public static final int END_Y=4; 
  403. private int currentX,currentY;//当前被选中的X和Y,只有这两个需要改变 
  404. private Point p=new Point();//当前鼠标移的地点 
  405. private boolean showTip=true;//是否显示提示.如果鼠标左键一按,则提示不再显了 
  406. public Temp(JFrame jf,BufferedImage bi,int width,int height){ 
  407. this.jf=jf; 
  408. this.bi=bi; 
  409. this.width=width; 
  410. this.height=height; 
  411. this.addMouseListener(this); 
  412. this.addMouseMotionListener(this); 
  413. initRecs(); 
  414. private void initRecs(){ 
  415. rec=new Rectangle[8]; 
  416. for(int i=0;i<rec.length;i++){ 
  417. rec[i]=new Rectangle(); 
  418. public void paintComponent(Graphics g){ 
  419. g.drawImage(bi,0,0,width,height,this); 
  420. g.setColor(Color.RED); 
  421. g.drawLine(startX,startY,endX,startY); 
  422. g.drawLine(startX,endY,endX,endY); 
  423. g.drawLine(startX,startY,startX,endY); 
  424. g.drawLine(endX,startY,endX,endY); 
  425. int x=startX<endX?startX:endX; 
  426. int y=startY<endY?startY:endY; 
  427. select=new Rectangle(x,y,Math.abs(endX-startX),Math.abs(endY-startY)); 
  428. int x1=(startX+endX)/2; 
  429. int y1=(startY+endY)/2; 
  430. g.fillRect(x1-2,startY-2,5,5); 
  431. g.fillRect(x1-2,endY-2,5,5); 
  432. g.fillRect(startX-2,y1-2,5,5); 
  433. g.fillRect(endX-2,y1-2,5,5); 
  434. g.fillRect(startX-2,startY-2,5,5); 
  435. g.fillRect(startX-2,endY-2,5,5); 
  436. g.fillRect(endX-2,startY-2,5,5); 
  437. g.fillRect(endX-2,endY-2,5,5); 
  438. rec[0]=new Rectangle(x-5,y-5,10,10); 
  439. rec[1]=new Rectangle(x1-5,y-5,10,10); 
  440. rec[2]=new Rectangle((startX>endX?startX:endX)-5,y-5,10,10); 
  441. rec[3]=new Rectangle((startX>endX?startX:endX)-5,y1-5,10,10); 
  442. rec[4]=new Rectangle((startX>endX?startX:endX)-5,(startY>endY?startY:endY)-5,10,10); 
  443. rec[5]=new Rectangle(x1-5,(startY>endY?startY:endY)-5,10,10); 
  444. rec[6]=new Rectangle(x-5,(startY>endY?startY:endY)-5,10,10); 
  445. rec[7]=new Rectangle(x-5,y1-5,10,10); 
  446. if(showTip){ 
  447. g.setColor(Color.CYAN); 
  448. g.fillRect(p.x,p.y,170,20); 
  449. g.setColor(Color.RED); 
  450. g.drawRect(p.x,p.y,170,20); 
  451. g.setColor(Color.BLACK); 
  452. g.drawString("请按住鼠标左键不放选择截图区",p.x,p.y+15); 
  453. //根据东南西北等八个方向决定选中的要修改的X和Y的座标 
  454. private void initSelect(States state){ 
  455. switch(state){ 
  456. case DEFAULT: 
  457. currentX=0; 
  458. currentY=0; 
  459. break
  460. case EAST: 
  461. currentX=(endX>startX?END_X:START_X); 
  462. currentY=0; 
  463. break
  464. case WEST: 
  465. currentX=(endX>startX?START_X:END_X); 
  466. currentY=0; 
  467. break
  468. case NORTH: 
  469. currentX=0; 
  470. currentY=(startY>endY?END_Y:START_Y); 
  471. break
  472. case SOUTH: 
  473. currentX=0; 
  474. currentY=(startY>endY?START_Y:END_Y); 
  475. break
  476. case NORTH_EAST: 
  477. currentY=(startY>endY?END_Y:START_Y); 
  478. currentX=(endX>startX?END_X:START_X); 
  479. break
  480. case NORTH_WEST: 
  481. currentY=(startY>endY?END_Y:START_Y); 
  482. currentX=(endX>startX?START_X:END_X); 
  483. break
  484. case SOUTH_EAST: 
  485. currentY=(startY>endY?START_Y:END_Y); 
  486. currentX=(endX>startX?END_X:START_X); 
  487. break
  488. case SOUTH_WEST: 
  489. currentY=(startY>endY?START_Y:END_Y); 
  490. currentX=(endX>startX?START_X:END_X); 
  491. break
  492. default
  493. currentX=0; 
  494. currentY=0; 
  495. break
  496. public void mouseMoved(MouseEvent me){ 
  497. doMouseMoved(me); 
  498. initSelect(current); 
  499. if(showTip){ 
  500. p=me.getPoint(); 
  501. repaint(); 
  502. //特意定义一个方法处理鼠标移动,是为了每次都能初始化一下所要选择的地区 
  503. private void doMouseMoved(MouseEvent me){ 
  504. if(select.contains(me.getPoint())){ 
  505. this.setCursor(new Cursor(Cursor.MOVE_CURSOR)); 
  506. current=States.MOVE; 
  507. else
  508. States[] st=States.values(); 
  509. for(int i=0;i<rec.length;i++){ 
  510. if(rec[i].contains(me.getPoint())){ 
  511. current=st[i]; 
  512. this.setCursor(st[i].getCursor()); 
  513. return
  514. this.setCursor(cs); 
  515. current=States.DEFAULT; 
  516. public void mouseExited(MouseEvent me){ 
  517. public void mouseEntered(MouseEvent me){ 
  518. public void mouseDragged(MouseEvent me){ 
  519. int x=me.getX(); 
  520. int y=me.getY(); 
  521. if(current==States.MOVE){ 
  522. startX+=(x-tempX); 
  523. startY+=(y-tempY); 
  524. endX+=(x-tempX); 
  525. endY+=(y-tempY); 
  526. tempX=x; 
  527. tempY=y; 
  528. }else if(current==States.EAST||current==States.WEST){ 
  529. if(currentX==START_X){ 
  530. startX+=(x-tempX); 
  531. tempX=x; 
  532. }else
  533. endX+=(x-tempX); 
  534. tempX=x; 
  535. }else if(current==States.NORTH||current==States.SOUTH){ 
  536. if(currentY==START_Y){ 
  537. startY+=(y-tempY); 
  538. tempY=y; 
  539. }else
  540. endY+=(y-tempY); 
  541. tempY=y; 
  542. }else if(current==States.NORTH_EAST||current==States.NORTH_EAST|| 
  543. current==States.SOUTH_EAST||current==States.SOUTH_WEST){ 
  544. if(currentY==START_Y){ 
  545. startY+=(y-tempY); 
  546. tempY=y; 
  547. }else
  548. endY+=(y-tempY); 
  549. tempY=y; 
  550. if(currentX==START_X){ 
  551. startX+=(x-tempX); 
  552. tempX=x; 
  553. }else
  554. endX+=(x-tempX); 
  555. tempX=x; 
  556. }else
  557. startX=tempX; 
  558. startY=tempY; 
  559. endX=me.getX(); 
  560. endY=me.getY(); 
  561. this.repaint(); 
  562. public void mousePressed(MouseEvent me){ 
  563. showTip=false
  564. tempX=me.getX(); 
  565. tempY=me.getY(); 
  566. public void mouseReleased(MouseEvent me){ 
  567. if(me.isPopupTrigger()){ 
  568. if(current==States.MOVE){ 
  569. showTip=true
  570. p=me.getPoint(); 
  571. startX=0; 
  572. startY=0; 
  573. endX=0; 
  574. endY=0; 
  575. repaint(); 
  576. else
  577. jf.dispose(); 
  578. updates(); 
  579. public void mouseClicked(MouseEvent me){ 
  580. if(me.getClickCount()==2){ 
  581. //Rectangle rec=new Rectangle(startX,startY,Math.abs(endX-startX),Math.abs(endY-startY)); 
  582. Point p=me.getPoint(); 
  583. if(select.contains(p)){ 
  584. if(select.x+select.width<this.getWidth()&&select.y+select.height<this.getHeight()){ 
  585. get=bi.getSubimage(select.x,select.y,select.width,select.height); 
  586. jf.dispose(); 
  587. updates(); 
  588. }else
  589. int wid=select.width,het=select.height; 
  590. if(select.x+select.width>=this.getWidth()){ 
  591. wid=this.getWidth()-select.x; 
  592. if(select.y+select.height>=this.getHeight()){ 
  593. het=this.getHeight()-select.y; 
  594. get=bi.getSubimage(select.x,select.y,wid,het); 
  595. jf.dispose(); 
  596. updates(); 
  597. public static void main(String args[]){ 
  598. SwingUtilities.invokeLater(new Runnable(){ 
  599. public void run(){ 
  600. new CaptureScreen(); 
  601. }); 
  602. //一些表示状态的枚举 
  603. enum States{ 
  604. NORTH_WEST(new Cursor(Cursor.NW_RESIZE_CURSOR)),//表示西北角 
  605. NORTH(new Cursor(Cursor.N_RESIZE_CURSOR)), 
  606. NORTH_EAST(new Cursor(Cursor.NE_RESIZE_CURSOR)), 
  607. EAST(new Cursor(Cursor.E_RESIZE_CURSOR)), 
  608. SOUTH_EAST(new Cursor(Cursor.SE_RESIZE_CURSOR)), 
  609. SOUTH(new Cursor(Cursor.S_RESIZE_CURSOR)), 
  610. SOUTH_WEST(new Cursor(Cursor.SW_RESIZE_CURSOR)), 
  611. WEST(new Cursor(Cursor.W_RESIZE_CURSOR)), 
  612. MOVE(new Cursor(Cursor.MOVE_CURSOR)), 
  613. DEFAULT(new Cursor(Cursor.DEFAULT_CURSOR)); 
  614. private Cursor cs; 
  615. States(Cursor cs){ 
  616. this.cs=cs; 
  617. public Cursor getCursor(){ 
  618. return cs; 

希望本文所述对大家Java程序设计有所帮助。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表