1. 程式人生 > >Java裁剪圖片例項

Java裁剪圖片例項

package com.wk.image

import java.awt.AWTException;
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import java.net.URL;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
public class CutImageFrame extends JFrame {
    private Image img = null; // 宣告影象物件
    private OldImagePanel oldImagePanel = null; // 宣告影象面板物件
    private int pressPanelX = 0, pressPanelY = 0;// 滑鼠按下點的X、Y座標 
    private int pressX = 0, pressY = 0;// 滑鼠按下點在螢幕上的X、Y座標
    private int releaseX = 0, releaseY = 0;// 滑鼠釋放點在螢幕上的X、Y座標
    private Robot robot = null;  // 宣告Robot物件
    private BufferedImage buffImage = null; // 宣告緩衝影象物件
    private CutImagePanel cutImagePanel = new CutImagePanel(); // 建立繪製裁剪結果的面板
    private boolean flag = false;  // 宣告標記變數,為true時顯示選擇區域的矩形,否則不顯示
    public static void main(String args[]) {
        CutImageFrame frame = new CutImageFrame();
        frame.setVisible(true);
    }
    public CutImageFrame() {
        super();
        URL imgUrl = CutImageFrame.class.getResource("/img/image.jpg");// 獲取圖片資源的路徑
        img = Toolkit.getDefaultToolkit().getImage(imgUrl); // 獲取影象資源
        oldImagePanel = new OldImagePanel(); // 建立影象面板物件
        this.setBounds(200, 160, 355, 276); // 設定窗體大小和位置
        final JSplitPane splitPane = new JSplitPane();
        splitPane.setDividerLocation((this.getWidth() / 2) - 10);
        getContentPane().add(splitPane, BorderLayout.CENTER);
        splitPane.setLeftComponent(oldImagePanel);
        splitPane.setRightComponent(cutImagePanel);
        oldImagePanel.addMouseListener(new MouseAdapter() {
            public void mousePressed(final MouseEvent e) {  // 滑鼠鍵按下事件
                pressPanelX = e.getX(); // 獲得滑鼠按下點的X座標 
                pressPanelY = e.getY();// 獲得滑鼠按下點的Y座標 
                pressX = e.getXOnScreen() + 1;// 滑鼠按下點在螢幕上的X座標加1,即去除選擇線
                pressY = e.getYOnScreen() + 1;// 滑鼠按下點在螢幕上的Y座標加1,即去除選擇線
                flag = true;// 為標記變數賦值為true
            }
            public void mouseReleased(final MouseEvent e) { // 滑鼠鍵釋放事件
                releaseX = e.getXOnScreen() - 1;// 滑鼠釋放點在螢幕上的X座標減1,即去除選擇線
                releaseY = e.getYOnScreen() - 1;// 滑鼠釋放點在螢幕上的Y座標減1,即去除選擇線
                try {
                    robot = new Robot();// 建立Robot物件
                    if (releaseX - pressX > 0 && releaseY - pressY > 0) {
                        Rectangle rect = new Rectangle(pressX, pressY, releaseX
                                - pressX, releaseY - pressY);// 建立Rectangle物件
                        buffImage = robot.createScreenCapture(rect);// 獲得緩衝影象物件
                        cutImagePanel.repaint(); // 呼叫CutImagePanel面板的paint()方法
                    }
                } catch (AWTException e1) {
                    e1.printStackTrace();
                }
                flag = false;// 為標記變數賦值為false
            }
        });
        oldImagePanel.addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(final MouseEvent e) {// 滑鼠拖動事件
                if (flag) {
                    releaseX = e.getXOnScreen();// 獲得滑鼠釋放點在螢幕上的X座標
                    releaseY = e.getYOnScreen();// 獲得滑鼠釋放點在螢幕上的Y座標
                    oldImagePanel.repaint();// 呼叫OldImagePanel面板的paint()方法
                }
            }
        });
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 設定窗體關閉模式
        this.setTitle("裁剪圖片"); // 設定窗體標題
    }
    
    class OldImagePanel extends JPanel {// 建立繪製原影象的面板類
        public void paint(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;
            g2.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);// 繪製圖像
            g2.setColor(Color.WHITE);
            if (flag) {
                float[] arr = { 5.0f }; // 建立虛線模式的陣列
                BasicStroke stroke = new BasicStroke(1, BasicStroke.CAP_BUTT,
                        BasicStroke.JOIN_BEVEL, 1.0f, arr, 0); // 建立寬度是1的平頭虛線筆畫物件
                g2.setStroke(stroke);// 設定筆畫物件
                g2.drawRect(pressPanelX, pressPanelY, releaseX - pressX,
                        releaseY - pressY);// 繪製矩形選區
            }
        }
    }
    
    class CutImagePanel extends JPanel {// 建立繪製裁剪結果的面板類
        public void paint(Graphics g) {
            g.clearRect(0, 0, this.getWidth(), this.getHeight());// 清除繪圖上下文的內容
            g.drawImage(buffImage, 0, 0, releaseX - pressX, releaseY - pressY,
                    this);// 繪製圖像
        }
    }
}