如何在Java中進(jìn)行圖片剪裁
這是一篇入門級文章,高手請略過。
在這篇文章中我們將學(xué)習(xí)如何用 Java 對圖像進(jìn)行剪裁并將剪裁出來的部分單獨(dú)保存到文件中。
我們將通過以下步驟來學(xué)習(xí):
- 輸入圖像,指定要處理的圖像路徑
- 允許用戶拖放要剪裁的部分
- 選擇后使用 Robot 類來確定剪裁部分的坐標(biāo)
- 剪裁所選圖像并保持
接下來我們開始編碼部分。
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;
說明:
- Graphics 類包含繪制矩形的方法
- 我們使用 Rectangle 類作為拖拉的矩形區(qū)域以作剪裁
- Robot 類用于捕獲屏幕截圖
- 使用鼠標(biāo)偵聽器來獲取鼠標(biāo)的拖拉時(shí)間
- Robot 類使用 BufferedImage 來做圖像處理
- File 類用于打開圖像文件
- ImageIO 類用于將圖像寫到 png 或者 jpg 圖像文件中
- JFrame 用于顯示界面
現(xiàn)在我們編寫包含 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();
- }
說明:
- 編寫了一個(gè)名為 CropImage 的類
- 該類擴(kuò)展了 JFrame 以實(shí)現(xiàn) frame 的所有功能
- 實(shí)現(xiàn)了不同的鼠標(biāo)事件偵聽器以便知道用戶什么時(shí)候開始拖動(dòng)鼠標(biāo)指針
- drag_status 變量用于保存鼠標(biāo)開始拖動(dòng)時(shí)的坐標(biāo)
- 我們定義了 main 方法去調(diào)用一個(gè) start 方法,這個(gè)方法將在下面定義
接下來是 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);
- }
說明:
- 我們定義一個(gè)名為 ImagePanel 的類,使用要處理的圖像作為參數(shù)
- 在 JFrame 中放置這個(gè)要顯示圖片的 ImagePanel,并開始偵聽鼠標(biāo)事件
下面我們定義用于處理鼠標(biāo)事件的方法
Listing 3: 鼠標(biāo)事件處理函數(shù)
- @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);
- }
說明:
- 當(dāng)鼠標(biāo)按下時(shí)存儲當(dāng)前坐標(biāo)到 c1 和 c2
- 當(dāng)鼠標(biāo)按下并開始拖動(dòng)時(shí)將拖動(dòng)狀態(tài)變量 drag_status 設(shè)置為 true
- 到鼠標(biāo)按鍵松開時(shí)表示圖像剪裁區(qū)域已經(jīng)選擇完畢,調(diào)用 draggedscreen 方法
- paint 方法用于拖動(dòng)時(shí)候的矩形顯示,通過當(dāng)前坐標(biāo)和初始記錄的坐標(biāo)來繪制矩形
下面是 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.");
- }}
說明:
- 首先計(jì)算圖像的高度和寬度
- 使用 Robot 類來對剪裁的區(qū)域進(jìn)行截圖并保持到另外一個(gè)文件 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);
- }
- }
英文原文:http://mrbool.com/how-to-crop-an-image-using-java/25272