溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中怎么實(shí)現(xiàn)一個(gè)圖片剪裁功能

發(fā)布時(shí)間:2021-07-01 17:23:29 來(lái)源:億速云 閱讀:147 作者:Leah 欄目:編程語(yǔ)言

Java中怎么實(shí)現(xiàn)一個(gè)圖片剪裁功能,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

Listing1: 引入的類(lèi)

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;

說(shuō)明:

  1. Graphics 類(lèi)包含繪制矩形的方法

  2. 我們使用 Rectangle 類(lèi)作為拖拉的矩形區(qū)域以作剪裁

  3. Robot 類(lèi)用于捕獲屏幕截圖

  4. 使用鼠標(biāo)偵聽(tīng)器來(lái)獲取鼠標(biāo)的拖拉時(shí)間

  5. Robot 類(lèi)使用 BufferedImage 來(lái)做圖像處理

  6. File 類(lèi)用于打開(kāi)圖像文件

  7. ImageIO 類(lèi)用于將圖像寫(xiě)到 png 或者 jpg 圖像文件中

  8. JFrame 用于顯示界面

現(xiàn)在我們編寫(xiě)包含 main 方法的入口類(lèi)

Listing2: 入口類(lèi)

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();  }

說(shuō)明:

  1. 編寫(xiě)了一個(gè)名為 CropImage 的類(lèi)

  2. 該類(lèi)擴(kuò)展了 JFrame 以實(shí)現(xiàn) frame 的所有功能

  3. 實(shí)現(xiàn)了不同的鼠標(biāo)事件偵聽(tīng)器以便知道用戶什么時(shí)候開(kāi)始拖動(dòng)鼠標(biāo)指針

  4. drag_status 變量用于保存鼠標(biāo)開(kāi)始拖動(dòng)時(shí)的坐標(biāo)

  5. 我們定義了 main 方法去調(diào)用一個(gè) start 方法,這個(gè)方法將在下面定義

接下來(lái)是 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);  }

說(shuō)明:

  1. 我們定義一個(gè)名為 ImagePanel 的類(lèi),使用要處理的圖像作為參數(shù)

  2. 在 JFrame 中放置這個(gè)要顯示圖片的 ImagePanel,并開(kāi)始偵聽(tīng)鼠標(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);         }

說(shuō)明:

  1. 當(dāng)鼠標(biāo)按下時(shí)存儲(chǔ)當(dāng)前坐標(biāo)到 c1 和 c2

  2. 當(dāng)鼠標(biāo)按下并開(kāi)始拖動(dòng)時(shí)將拖動(dòng)狀態(tài)變量 drag_status 設(shè)置為 true

  3. 到鼠標(biāo)按鍵松開(kāi)時(shí)表示圖像剪裁區(qū)域已經(jīng)選擇完畢,調(diào)用 draggedscreen 方法

  4. paint 方法用于拖動(dòng)時(shí)候的矩形顯示,通過(guò)當(dāng)前坐標(biāo)和初始記錄的坐標(biāo)來(lái)繪制矩形

下面是 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.");  }}

說(shuō)明:

  1. 首先計(jì)算圖像的高度和寬度

  2. 使用 Robot 類(lèi)來(lái)對(duì)剪裁的區(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);    }  }

關(guān)于Java中怎么實(shí)現(xiàn)一個(gè)圖片剪裁功能問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI