我們將透過以下步驟來學習:
輸入影像,指定要處理的影像路徑
允許用戶拖放要剪裁的部分
選擇後使用Robot 類別來確定剪裁部分的座標
剪裁所選圖像並保持
接下來我們開始編碼部分。
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 類別作為拖曳的矩形區域以作剪裁
Robot 類別用於擷取螢幕截圖
使用滑鼠偵聽器來取得滑鼠的拖曳時間
Robot 類別使用BufferedImage 來做影像處理
File 類別用於開啟圖像文件
ImageIO 類別用於將圖像寫入png 或jpg 圖像檔案中
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();
}
說明:
寫了一個名為CropImage 的類
這個類別擴展了JFrame 以實現frame 的所有功能
實作了不同的滑鼠事件偵聽器以便知道使用者何時開始拖曳滑鼠指標
drag_status 變數用於保存滑鼠開始拖曳時的座標
我們定義了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);
}
說明:
我們定義一個名為ImagePanel 的類,使用要處理的映像作為參數
在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);
}
說明:
當滑鼠按下時儲存當前座標到c1 和c2
當滑鼠按下並開始拖曳時將拖曳狀態變數drag_status 設為true
到滑鼠按鍵放開時表示影像剪裁區域已經選擇完畢,呼叫draggedscreen 方法
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.");
}}
說明:
首先計算影像的高度和寬度
使用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);
}
}