2KB项目,专业的源码交易网站 帮助 收藏 每日签到

如何在 Java 中进行图片剪裁

  • 时间:2019-01-23 18:44 编辑:2KB 来源:2KB.COM 阅读:326
  • 扫一扫,手机访问
  • 分享
摘要: 英文原文:How
英文原文:How to Crop an image using Java

这是一篇入门级文章,高手请略过。

在这篇文章中我们将学习如何用 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:Wallpaperwallpapers1.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:Wallpaperwallpapers1.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);	
}
}
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。


2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务

  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【计算机/互联网|】Nginx出现502错误(2020-01-20 21:02)
【计算机/互联网|】网站运营全智能软手V0.1版发布(2020-01-20 12:16)
【计算机/互联网|】淘宝这是怎么了?(2020-01-19 19:15)
【行业动态|】谷歌关闭小米智能摄像头,因为窃听器显示了陌生人家中的照片(2020-01-15 09:42)
【行业动态|】据报道谷歌新闻终止了数字杂志,退还主动订阅(2020-01-15 09:39)
【行业动态|】康佳将OLED电视带到美国与LG和索尼竞争(2020-01-15 09:38)
【行业动态|】2020年最佳AV接收机(2020-01-15 09:35)
【行业动态|】2020年最佳流媒体设备:Roku,Apple TV,Firebar,Chromecast等(2020-01-15 09:31)
【行业动态|】CES 2020预览:更多的流媒体服务和订阅即将到来(2020-01-08 21:41)
【行业动态|】从埃隆·马斯克到杰夫·贝佐斯,这30位人物定义了2010年代(2020-01-01 15:14)
联系我们

Q Q: 7090832

电话:400-0011-990

邮箱:7090832@qq.com

时间:9:00-23:00

联系客服
商家入住 服务咨询 投拆建议 联系客服
0577-67068160
手机版

扫一扫进手机版
返回顶部