java实现 模仿QQ截图功能

jopen 10年前

因项目需求,写了个模仿QQ截图的功能,没有QQ弄的那么好,截图主要是存放在服务器的,并没有 

在前台展示,需要展示的时候,再从服务器取就可以了。待完善。


1.页面的调用

//进行截图, 并将图片存放在制定路径(是手工截取的,跟系统需求不符合)  function  screenCapture(){       var params="method=screenCapture";    var url = "<%=basePath%>/NameCheck.do";       $.post(url,params,function(megs){         $("#screen").val(megs);       });  }


2. 后台代码Action

package com.contactlist.action;    import java.awt.GraphicsEnvironment;  import java.io.File;  import java.io.FileNotFoundException;  import java.io.FileOutputStream;  import java.io.IOException;  import java.io.PrintWriter;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletResponse;  import org.apache.struts.action.ActionForm;  import org.apache.struts.action.ActionForward;  import org.apache.struts.action.ActionMapping;  import org.apache.struts.actions.DispatchAction;  import org.apache.struts.upload.FormFile;  import com.destination.action.ScreenCapture;  import com.weibo.weibo4j.util.URLEncodeUtils;    public class NameCheckAction extends DispatchAction  {      /**       * 截图并将图片存在指定文件里面       *        * @author Beau Virgill       * @param mapping       * @param form       * @param request       * @param response       * @throws Exception       */        public ActionForward screenCapture(ActionMapping mapping, ActionForm form, HttpServletRequest request,              HttpServletResponse response) throws Exception      {          System.out.println("--------------------------------手工截取google地图----------------------------------in");          GraphicsEnvironment ge =  GraphicsEnvironment.getLocalGraphicsEnvironment();             System.out.println("ge.isHeadless() = " + ge.isHeadless());             if (ge.isHeadless()) {                System.setProperty("java.awt.headless", "false");             }          String filepath = NameCheckAction.class.getResource("/").getPath();          String savepath2 = "";          String osName = System.getProperty("os.name");          log.info("osName==========" + osName);          if (osName.charAt(0) == 'W')          {              savepath2 = filepath.substring(1, filepath.length() - 16) + "photoUpload/" + "screenCapture.jpg";          }          else          {              savepath2 = filepath.substring(0, filepath.length() - 16) + "photoUpload" + File.separator                      + "screenCapture.jpg";          }          File tempFile = new File(URLEncodeUtils.decodeURL(savepath2));            ScreenCapture capture = ScreenCapture.getInstance();          capture.captureImage();          System.out.println(URLEncodeUtils.decodeURL(savepath2));          try          {              capture.saveToFile(tempFile);          }          catch (IOException e)          {              // TODO Auto-generated catch block              e.printStackTrace();          }          PrintWriter out = response.getWriter();          out.print(URLEncodeUtils.decodeURL(savepath2));            return null;      }        /**       * ajax返回JSON 组装数据       *        * @author      Beau Virgill 注:(此方法有误,慎用。)       * @param msg       * @param response       * @throws Exception       */        public void ajaxReturn(HttpServletResponse response, String msg)      {          response.setCharacterEncoding("UTF-8");          response.setContentType("application/json");          PrintWriter out = null;          try          {              out = response.getWriter();              StringBuffer rebuf = new StringBuffer("{msg:\'" + msg + "\'"); // 使用STRINGBUFFER组装相关数据              rebuf.append("}");              out.println(rebuf.toString());              System.out.println(rebuf.toString());          }          catch (Exception e)          {              e.printStackTrace();          }          finally          {              out.flush();              out.close();          }      }        private int saveFile(FormFile file, String fileSavePath)      {            FileOutputStream fileOutput;          try          {              fileOutput = new FileOutputStream(fileSavePath);              fileOutput.write(file.getFileData());              fileOutput.flush();              fileOutput.close();          }          catch (FileNotFoundException e)          {              e.printStackTrace();              log.error("配置的上传路径不存在!");              return 81;          }          catch (IOException e)          {              e.printStackTrace();              log.error("请确认当前用户对配置的上传路径目录是否有写权限!");              return 82;          }          return 10;      }    }


3.  Action调用的封装的截图方法

package com.destination.action;    import java.awt.AWTException;  import java.awt.BorderLayout;  import java.awt.Cursor;  import java.awt.Rectangle;  import java.awt.Robot;  import java.awt.Toolkit;  import java.awt.event.MouseAdapter;  import java.awt.event.MouseEvent;  import java.awt.event.MouseMotionAdapter;  import java.awt.image.BufferedImage;  import java.io.File;  import java.io.IOException;  import java.io.OutputStream;    import javax.imageio.ImageIO;  import javax.swing.Icon;  import javax.swing.ImageIcon;  import javax.swing.JDialog;  import javax.swing.JPanel;    public class ScreenCapture  {      private static ScreenCapture dafaultCapture=new ScreenCapture();      private int x1,y1,x2,y2;      private int recX,recY,recH,recW;      private boolean isFirstPoint=true;      private BackgroudImage labFullScreenImage=new BackgroudImage();      private Robot robot;      private BufferedImage fullScreenImage;      private BufferedImage pickedImage;      private String defaultImageFormater="jpg";      private JDialog dialog=new JDialog();      private ScreenCapture(){                  try{              robot=new Robot();          }catch (AWTException e) {            System.err.println("Internal Error:"+e);            e.printStackTrace();          }          JPanel cp=(JPanel) dialog.getContentPane();          cp.setLayout(new BorderLayout());          labFullScreenImage.addMouseListener(new MouseAdapter(){              public void mouseReleased(MouseEvent evn){                  isFirstPoint=true;                  pickedImage=fullScreenImage.getSubimage(recX, recY, recW, recH);                  dialog.setVisible(false);              }          });          labFullScreenImage.addMouseMotionListener(new MouseMotionAdapter(){              public void mouseDragged(MouseEvent evn){                  if(isFirstPoint){                      x1=evn.getX();                      y1=evn.getY();                      isFirstPoint=false;                  }else{                      x2=evn.getX();                      y2=evn.getY();                      int maxX=Math.max(x1, x2);                      int maxY=Math.max(y1, y2);                      int minX=Math. min(x1, x2);                      int minY=Math. min(y1, y2);                      recX=minX;                      recY=minY;                      recW=maxX-minX;                      recH=maxY-minY;                    labFullScreenImage.drowRectangle(recX, recY, recW, recH);                  }              }              public void mouseMoved(MouseEvent e){                  labFullScreenImage.drowCross(e.getX(), e.getY());              }          });          cp.add(BorderLayout.CENTER,labFullScreenImage);          dialog.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));          dialog.setAlwaysOnTop(true);          dialog.setMaximumSize(Toolkit.getDefaultToolkit().getScreenSize());          dialog.setUndecorated(true);          dialog.setSize(dialog.getMaximumSize());          dialog.setModal(true);      }            public static ScreenCapture getInstance(){          return dafaultCapture;      }            public  Icon captureFullScreen(){          fullScreenImage=robot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));          ImageIcon icon=new ImageIcon(fullScreenImage);          return icon;      }            public void captureImage(){          dialog.setVisible(false);          fullScreenImage=robot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));          ImageIcon icon=new ImageIcon(fullScreenImage);          labFullScreenImage.setIcon(icon);          dialog.setVisible(true);      }            public BufferedImage getPickedImage(){          return pickedImage;      }            public ImageIcon getPickedIcon(){          return new ImageIcon(getPickedImage());      }            public void saveToFile(File file) throws IOException{          ImageIO.write(getPickedImage(), defaultImageFormater, file);      }            public void saveAsPNG(File file) throws IOException{          ImageIO.write(getPickedImage(), "png", file);      }            public void saveAsJPEG(File file) throws IOException{          ImageIO.write(getPickedImage(), "JPEG", file);      }            public void write(OutputStream out)throws IOException{          ImageIO.write(getPickedImage(),defaultImageFormater, out);      }          }


4.  封装的背景图片方法

package com.destination.action;    import java.awt.Graphics;    import javax.swing.JLabel;    public class BackgroudImage extends JLabel{          int lineX,lineY;          int x,y,h,w;                    public void drowCross(int x,int y){              lineX=x;              lineY=y;              repaint();          }                    public void drowRectangle(int x,int y,int w,int h){              this.x=x;              this.y=y;              this.h=h;              this.w=w;              repaint();          }                    public void paintComponent(Graphics g){              super.paintComponent(g);              g.drawRect(x, y, w, h);              String area=Integer.toString(w)+"*"+Integer.toString(h);              g.drawString(area, x+(int)w/2-15, y+(int)h/2);              g.drawLine(lineX, 0, lineX, getHeight());              g.drawLine(0, lineY, getWidth(), lineY);                        }    }