第一页
第二页
第三页
主窗口的背景像素不是捕获的图像的一部分;就不可能把它们包含在修剪的图片内。因此,无论何时把背景像素包含在修剪区域内,操作都会失败,并且会给出一个“Out of bounds”错误信息。
修剪操作由ImageArea的public Boolean crop()方法处理。如果完成了修剪或者没有选择子图像(当没有选中内容时调用这个方法是非常方便的)该方法(如下所示)返回true。如果在选择区域中包含了背景像素则返回false。
public boolean crop ()
{
// There is nothing to crop if the selection rectangle is only 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…菜单项时,它的监听器就会显示一个保存文件选择器。假定你没有退出选择器,监听器就会确保你选择的文件名是以.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.awt.Robot`类。该类提供了一系列方法来模拟键盘和鼠标操作,并允许开发人员捕获整个屏幕或屏幕的一部分。 ##### 1. `java.awt.Robot`类简介 `java.awt.Robot`是...
在Java中,实现屏幕抓图主要依赖于`java.awt.Robot`类,它提供了屏幕捕获的功能。通过创建`Robot`实例,可以获取整个屏幕或指定区域的图像。此功能广泛应用于自动化测试、屏幕录制工具和各种需要捕捉屏幕画面的应用...
在屏幕抓图中,我们需要利用`java.awt.Robot`类,它能够模拟用户的键盘和鼠标操作,包括捕获屏幕图像。以下是一个简单的屏幕抓图示例: ```java import java.awt.*; import java.io.*; public class Screenshot { ...
要实现屏幕抓图,首先需要创建一个Robot对象,然后调用其createScreenCapture()方法。这个方法需要一个Rectangle参数,定义了要捕获的屏幕区域的坐标和大小。如果不指定特定区域,将默认截取全屏图像。 3. **创建...
在Java编程语言中,实现屏幕抓图功能是一项常见的任务,特别是在开发桌面应用或者需要进行自动化测试时。这个项目提供了一段源码,模仿了QQ截图的功能,允许用户通过拖动鼠标来选择屏幕上的任何区域进行截图,并且...
实现屏幕抓图的技术有多种,其中最基础的是操作系统内置的功能。例如,在Windows系统中,可以使用Print Screen (PrtScn) 键来全屏截图,或者使用Alt + PrtScn组合键来捕获当前活动窗口。截取的图像会被复制到剪贴板...
通过下载和学习,你可以深入了解JAVA如何实现抓图功能,并从中获得实践经验。 【标签】:“抓图程序说明 PPT” 标签“抓图程序说明”表明了这个教程的核心内容,即解释如何创建和使用抓图程序。而“PPT”标签则...
Java的`java.awt.Robot`类可以用来模拟键盘和鼠标操作,实现屏幕截图的功能。 2. 图像编辑模块:用户可能需要对截图进行裁剪、添加注释等操作,这部分可以通过Java的图像处理库如Java AWT和Swing来实现。 3. 存储...
调用`Robot.createScreenCapture(Rectangle)`方法,传入屏幕的特定区域(比如整个屏幕或指定窗口)来获取截图。 4. **保存截图**:将截取的图像(`java.awt.image.BufferedImage`对象)保存为图片文件,如JPEG或PNG...
在IT领域,获取鼠标在任意点的颜色是一项常见的需求,尤其在图形用户界面(GUI)开发、屏幕抓图软件或颜色检测应用中。这个压缩包文件"获取鼠标在任意点的颜色.rar"很可能包含了一个程序或者代码示例,用于演示如何...
在Java编程语言的广阔世界里,有一款名为"ScreenShotForMac"的工具,专门针对Mac用户设计,旨在提供便捷的屏幕抓图功能。本文将深入探讨这款程序的实现原理和应用价值。 首先,让我们了解一下Java编程语言。Java是...
5. 屏幕捕获:Loupe可能使用`java.awt.Robot`类来捕获屏幕上的图像,这是Java提供的一种系统级别的屏幕抓图功能。 6. 图形绘制:在放大区域内,Loupe需要绘制放大的图像。这可能使用了`Graphics2D`类,它提供了丰富...