Java圖片剪裁併儲存的程式碼實現

oschina發表於2014-12-29

這是一篇入門級文章,高手請略過。

在這篇文章中我們將學習如何用 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);
}
}

相關文章