时间:2021-05-20
这是一篇入门级文章,高手请略过。
在这篇文章中我们将学习如何用 Java 对图像进行剪裁并将剪裁出来的部分单独保存到文件中。
我们将通过以下步骤来学习:
1.输入图像,指定要处理的图像路径
2.允许用户拖放要剪裁的部分
3.选择后使用 Robot 类来确定剪裁部分的坐标
4.剪裁所选图像并保持
接下来我们开始编码部分。
Listing1: 引入的类
复制代码 代码如下:
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
说明:
1.Graphics 类包含绘制矩形的方法
2.我们使用 Rectangle 类作为拖拉的矩形区域以作剪裁
3.Robot 类用于捕获屏幕截图
4.使用鼠标侦听器来获取鼠标的拖拉时间
5.Robot 类使用 BufferedImage 来做图像处理
6.File 类用于打开图像文件
7.ImageIO 类用于将图像写到 png 或者 jpg 图像文件中
8.JFrame 用于显示界面
现在我们编写包含 main 方法的入口类
Listing2: 入口类
复制代码 代码如下:
public class CropImage extends JFrame implements MouseListener, MouseMotionListener
{
int drag_status=0,c1,c2,c3,c4;
public static void main(String args[])
{
new CropImage().start();
}
说明:
1.编写了一个名为 CropImage 的类
2.该类扩展了 JFrame 以实现 frame 的所有功能
3.实现了不同的鼠标事件侦听器以便知道用户什么时候开始拖动鼠标指针
4.drag_status 变量用于保存鼠标开始拖动时的坐标
5.我们定义了 main 方法去调用一个 start 方法,这个方法将在下面定义
接下来是 start 方法
Listing 2
复制代码 代码如下:
public void start()
{
ImagePanel im=new ImagePanel("F:\\Wallpaper\\wallpapers\\1.jpg");
add(im);
setSize(400,400);
setVisible(true);
addMouseListener(this);
addMouseMotionListener( this );
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
说明:
1.我们定义一个名为 ImagePanel 的类,使用要处理的图像作为参数
2.在 JFrame 中放置这个要显示图片的 ImagePanel,并开始侦听鼠标事件
下面我们定义用于处理鼠标事件的方法
Listing 3: 鼠标事件处理函数
复制代码 代码如下:
@Override
public void mouseClicked(MouseEvent arg0) {
}
@Override
public void mouseEntered(MouseEvent arg0) {
}
@Override
public void mouseExited(MouseEvent arg0) {
}
@Override
public void mousePressed(MouseEvent arg0) {
repaint();
c1=arg0.getX();
c2=arg0.getY();
}
@Override
public void mouseReleased(MouseEvent arg0) {
repaint();
if(drag_status==1)
{
c3=arg0.getX();
c4=arg0.getY();
try
{
draggedScreen();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
@Override
public void mouseDragged(MouseEvent arg0) {
repaint();
drag_status=1;
c3=arg0.getX();
c4=arg0.getY();
}
@Override
public void mouseMoved(MouseEvent arg0) {
}
public void paint(Graphics g)
{
super.paint(g);
int w = c1 - c3;
int h = c2 - c4;
w = w * -1;
h = h * -1;
if(w<0)
w = w * -1;
g.drawRect(c1, c2, w, h);
}
说明:
1.当鼠标按下时存储当前坐标到 c1 和 c2
2.当鼠标按下并开始拖动时将拖动状态变量 drag_status 设置为 true
3.到鼠标按键松开时表示图像剪裁区域已经选择完毕,调用 draggedscreen 方法
4.paint 方法用于拖动时候的矩形显示,通过当前坐标和初始记录的坐标来绘制矩形
下面是 draggedscreen 方法的代码
Listing 4: draggedScreen 方法
复制代码 代码如下:
public void draggedScreen()throws Exception
{
int w = c1 - c3;
int h = c2 - c4;
w = w * -1;
h = h * -1;
Robot robot = new Robot();
BufferedImage img = robot.createScreenCapture(new Rectangle(c1, c2,w,h));
File save_path=new File("screen1.jpg");
ImageIO.write(img, "JPG", save_path);
System.out.println("Cropped image saved successfully.");
}}
说明:
1.首先计算图像的高度和宽度
2.使用 Robot 类来对剪裁的区域进行截图并保持到另外一个文件 screen1.jpg
完整的代码
Listing 5: ImagePanel.java
复制代码 代码如下:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
class ImagePanel extends JPanel {
private Image img;
public ImagePanel(String img) {
this(new ImageIcon(img).getImage());
}
public ImagePanel(Image img) {
this.img = img;
Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
// Dimension size = new Dimension(10,10);
setPreferredSize(size);
setMinimumSize(size);
setMaximumSize(size);
setSize(size);
setLayout(null);
}
public void paintComponent(Graphics g) {
g.drawImage(img, 0, 0, null);
}
}
Listing 6:CropImage.java
复制代码 代码如下:
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
public class CropImage extends JFrame implements MouseListener, MouseMotionListener
{
int drag_status=0,c1,c2,c3,c4;
public static void main(String args[])
{
new CropImage().start();
}
public void start()
{
ImagePanel im=new ImagePanel("F:\\Wallpaper\\wallpapers\\1.jpg");
add(im);
setSize(400,400);
setVisible(true);
addMouseListener(this);
addMouseMotionListener( this );
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void draggedScreen()throws Exception
{
int w = c1 - c3;
int h = c2 - c4;
w = w * -1;
h = h * -1;
Robot robot = new Robot();
BufferedImage img = robot.createScreenCapture(new Rectangle(c1, c2,w,h));
File save_path=new File("screen1.jpg");
ImageIO.write(img, "JPG", save_path);
System.out.println("Cropped image saved successfully.");
}
@Override
public void mouseClicked(MouseEvent arg0) {
}
@Override
public void mouseEntered(MouseEvent arg0) {
}
@Override
public void mouseExited(MouseEvent arg0) {
}
@Override
public void mousePressed(MouseEvent arg0) {
repaint();
c1=arg0.getX();
c2=arg0.getY();
}
@Override
public void mouseReleased(MouseEvent arg0) {
repaint();
if(drag_status==1)
{
c3=arg0.getX();
c4=arg0.getY();
try
{
draggedScreen();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
@Override
public void mouseDragged(MouseEvent arg0) {
repaint();
drag_status=1;
c3=arg0.getX();
c4=arg0.getY();
}
@Override
public void mouseMoved(MouseEvent arg0) {
}
public void paint(Graphics g)
{
super.paint(g);
int w = c1 - c3;
int h = c2 - c4;
w = w * -1;
h = h * -1;
if(w<0)
w = w * -1;
g.drawRect(c1, c2, w, h);
}
}
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
相关阅读:AngularJS入门教程之AngularJS表达式AngularJS入门教程之AngularJS指令在前面表达式和指令的教程中了解到,Angular
关于LoadRunner基础入门教程的介绍就到这里了,希望对大家有所帮助!想要详细了解LoadRunner基础入门教程,可以继续关注软件问题的最新动态。注意
图片处理中经常用的图片剪裁,就是通过剪裁框确定图片剪裁的区域,然后剪去该区域的图片,今天实现了一下,其实图片剪裁本身不难,主要剪裁框封装发了点时间,主要功能可以
在CAD中插入图片之后,可能对图片尺寸不满意,需要将其剪裁,但是CAD中剪裁操作不像是在PS或者是美图秀秀中剪裁,当然,这里也没有必要先剪裁之后,再插入CA
1.介绍本入门教程将介绍Java8中如何合并两个map。更具体说来,我们将研究不同的合并方案,包括Map含有重复元素的情况。2.初始化我们定义两个map实例pr