`
arison1983
  • 浏览: 28379 次
  • 性别: Icon_minigender_1
  • 来自: 新疆
最近访客 更多访客>>
社区版块
存档分类

Robot 实现屏幕抓图2

阅读更多

第一页   第二页   第三页

主窗口的背景像素不是捕获的图像的一部分;就不可能把它们包含在修剪的图片内。因此,无论何时把背景像素包含在修剪区域内,操作都会失败,并且会给出一个“Out of bounds”错误信息。



    修剪操作由ImageArea的public Boolean crop()方法处理。如果完成了修剪或者没有选择子图像(当没有选中内容时调用这个方法是非常方便的)该方法(如下所示)返回true。如果在选择区域中包含了背景像素则返回false。


public boolean crop ()

{

   // There is nothing to crop if the selection rectangle is o­nly a single

   // point.



   if (srcx == destx && srcy == desty)

       return true;



   // Assume success.



   boolean succeeded = true;



   // Compute upper-left and lower-right coordinates for selection rectangle

   // corners.



   int x1 = (srcx < destx) ? srcx : destx;

   int y1 = (srcy < desty) ? srcy : desty;



   int x2 = (srcx > destx) ? srcx : destx;

   int y2 = (srcy > desty) ? srcy : desty;



   // Compute width and height of selection rectangle.



   int width = (x2-x1)+1;

   int height = (y2-y1)+1;



   // Create a buffer to hold cropped image.



   BufferedImage biCrop = new BufferedImage (width, height,  
 

                                             BufferedImage.TYPE_INT_RGB);

   Graphics2D g2d = biCrop.createGraphics ();



   // Perform the crop operation.



   try

   {

       BufferedImage bi = (BufferedImage) image;

       BufferedImage bi2 = bi.getSubimage (x1, y1, width, height);

       g2d.drawImage (bi2, null, 0, 0);

   }

   catch (RasterFormatException e)

   {

      succeeded = false;

   }



   g2d.dispose ();



   if (succeeded)

       setImage (biCrop); // Implicitly remove selection rectangle.
 
   else

   {

       // Prepare to remove selection rectangle.



       srcx = destx;

       srcy = desty;



       // Explicitly remove selection rectangle.



       repaint ();

   }



   return succeeded;

}
 






    crop()方法调用BufferedImage的public BufferedImage
getSubimage(int x, int y, int w, int
h)方法摘取选择区域内的子图像。如果该方法的参数没有指定BufferedImage内的图像,它就会抛出一个
java.awt.image.RasterFormatException,因此就会返回false。



图像保存


    Capture允许你把捕获的图像保存为一个jpeg文件。你通过一个保存文件选择器指定文件名,选择器由Capture类的构造函数创建:

// Construct a save file-chooser. Initialize the starting directory to

// the current directory, do not allow the user to select the "all files"

// filter, and restrict the files that can be selected to those ending

// with .jpg or .jpeg extensions.



final JFileChooser fcSave = new JFileChooser ();

fcSave.setCurrentDirectory (new File (System.getProperty ("user.dir")));

fcSave.setAcceptAllFileFilterUsed (false);

fcSave.setFileFilter (new ImageFileFilter ());
 






    为了限制文件选择器的选择是文件夹或者是以.jpg或.jpeg为后缀的文件,就使用了ImageFileFilter类的一个实例作为保存时文件选择器的文件过滤器。该方法对于任何非文件夹和后缀名非.jpg/.jpeg的文件都返回false:

public boolean accept (File f)

{

   // Allow the user to select directories so that the user can navigate the

   // file system.



   if (f.isDirectory ())

       return true;



   // Allow the user to select files ending with a .jpg or a .jpeg

   // extension.



   String s = f.getName ();

   int i = s.lastIndexOf ('.');



   if (i > 0 && i < s.length ()-1)

   {

       String ext = s.substring (i+1).toLowerCase ();



       if (ext.equals ("jpg") || ext.equals ("jpeg"))

           return true;

   }



   // Nothing else can be selected.



   return false;

}
 






    当你选择了Save As&hellip;菜单项时,它的监听器就会显示一个保存文件选择器。假定你没有退出选择器,监听器就会确保你选择的文件名是以.jpg或.jpeg为后缀名。继续,监听器会确定文件是否存在,这样你就不会无意中覆盖一个存在的文件。

// Present the "save" file-chooser without any file selected.

// If the user cancels this file-chooser, exit this method.



fcSave.setSelectedFile (null);

if (fcSave.showSaveDialog (Capture.this) !=

    JFileChooser.APPROVE_OPTION)

    return;



// Obtain the selected file. Validate its extension, which 

// must be .jpg or .jpeg. If extension not present, append

// .jpg extension.



File file = fcSave.getSelectedFile ();

String path = file.getAbsolutePath ().toLowerCase ();

if (!path.endsWith (".jpg") && !path.endsWith (".jpeg"))

    file = new File (path += ".jpg");



// If the file exists, inform the user, who might not want

// to accidentally overwrite an existing file. Exit method

// if the user specifies that it is not okay to overwrite

// the file.


if (file.exists ())

{

    int choice =  JOptionPane.

                  showConfirmDialog (null,

                                     "Overwrite file?",

                                     "Capture",

                                     JOptionPane.

                                     YES_NO_OPTION);
 

    if (choice == JOptionPane.NO_OPTION)

        return;

} 

 

分享到:
评论

相关推荐

    JAVA实现屏幕抓图 远程桌面控制

    在Java中,要实现屏幕抓图的功能,主要依赖于`java.awt.Robot`类。该类提供了一系列方法来模拟键盘和鼠标操作,并允许开发人员捕获整个屏幕或屏幕的一部分。 ##### 1. `java.awt.Robot`类简介 `java.awt.Robot`是...

    一个简单的用JAVA实现的屏幕抓图(源代码)

    在Java中,实现屏幕抓图主要依赖于`java.awt.Robot`类,它提供了屏幕捕获的功能。通过创建`Robot`实例,可以获取整个屏幕或指定区域的图像。此功能广泛应用于自动化测试、屏幕录制工具和各种需要捕捉屏幕画面的应用...

    屏幕抓图程序

    在屏幕抓图中,我们需要利用`java.awt.Robot`类,它能够模拟用户的键盘和鼠标操作,包括捕获屏幕图像。以下是一个简单的屏幕抓图示例: ```java import java.awt.*; import java.io.*; public class Screenshot { ...

    java 屏幕抓图 源代码

    要实现屏幕抓图,首先需要创建一个Robot对象,然后调用其createScreenCapture()方法。这个方法需要一个Rectangle参数,定义了要捕获的屏幕区域的坐标和大小。如果不指定特定区域,将默认截取全屏图像。 3. **创建...

    JAVA屏幕抓图(源码)

    在Java编程语言中,实现屏幕抓图功能是一项常见的任务,特别是在开发桌面应用或者需要进行自动化测试时。这个项目提供了一段源码,模仿了QQ截图的功能,允许用户通过拖动鼠标来选择屏幕上的任何区域进行截图,并且...

    screen capture

    实现屏幕抓图的技术有多种,其中最基础的是操作系统内置的功能。例如,在Windows系统中,可以使用Print Screen (PrtScn) 键来全屏截图,或者使用Alt + PrtScn组合键来捕获当前活动窗口。截取的图像会被复制到剪贴板...

    抓图程序 JAVA版的教学PPT

    通过下载和学习,你可以深入了解JAVA如何实现抓图功能,并从中获得实践经验。 【标签】:“抓图程序说明 PPT” 标签“抓图程序说明”表明了这个教程的核心内容,即解释如何创建和使用抓图程序。而“PPT”标签则...

    红蜻蜓抓图

    Java的`java.awt.Robot`类可以用来模拟键盘和鼠标操作,实现屏幕截图的功能。 2. 图像编辑模块:用户可能需要对截图进行裁剪、添加注释等操作,这部分可以通过Java的图像处理库如Java AWT和Swing来实现。 3. 存储...

    根据url来获取页面的截图

    调用`Robot.createScreenCapture(Rectangle)`方法,传入屏幕的特定区域(比如整个屏幕或指定窗口)来获取截图。 4. **保存截图**:将截取的图像(`java.awt.image.BufferedImage`对象)保存为图片文件,如JPEG或PNG...

    获取鼠标在任意点的颜色.rar

    在IT领域,获取鼠标在任意点的颜色是一项常见的需求,尤其在图形用户界面(GUI)开发、屏幕抓图软件或颜色检测应用中。这个压缩包文件"获取鼠标在任意点的颜色.rar"很可能包含了一个程序或者代码示例,用于演示如何...

    ScreenShotForMac:用于截屏的Java程序我想触摸机器人类...

    在Java编程语言的广阔世界里,有一款名为"ScreenShotForMac"的工具,专门针对Mac用户设计,旨在提供便捷的屏幕抓图功能。本文将深入探讨这款程序的实现原理和应用价值。 首先,让我们了解一下Java编程语言。Java是...

    Loupe:拡大镜

    5. 屏幕捕获:Loupe可能使用`java.awt.Robot`类来捕获屏幕上的图像,这是Java提供的一种系统级别的屏幕抓图功能。 6. 图形绘制:在放大区域内,Loupe需要绘制放大的图像。这可能使用了`Graphics2D`类,它提供了丰富...

Global site tag (gtag.js) - Google Analytics