- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- Java中怎么實(shí)現一個(gè)圖片剪裁功能
Java中怎么實(shí)現一個(gè)圖片剪裁功能,針對這個(gè)問(wèn)題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個(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ō)明:
Graphics 類(lèi)包含繪制矩形的方法
我們使用 Rectangle 類(lèi)作為拖拉的矩形區域以作剪裁
Robot 類(lèi)用于捕獲屏幕截圖
使用鼠標偵聽(tīng)器來(lái)獲取鼠標的拖拉時(shí)間
Robot 類(lèi)使用 BufferedImage 來(lái)做圖像處理
File 類(lèi)用于打開(kāi)圖像文件
ImageIO 類(lèi)用于將圖像寫(xiě)到 png 或者 jpg 圖像文件中
JFrame 用于顯示界面
現在我們編寫(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ō)明:
編寫(xiě)了一個(gè)名為 CropImage 的類(lèi)
該類(lèi)擴展了 JFrame 以實(shí)現 frame 的所有功能
實(shí)現了不同的鼠標事件偵聽(tīng)器以便知道用戶(hù)什么時(shí)候開(kāi)始拖動(dòng)鼠標指針
drag_status 變量用于保存鼠標開(kāi)始拖動(dòng)時(shí)的坐標
我們定義了 main 方法去調用一個(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ō)明:
我們定義一個(gè)名為 ImagePanel 的類(lèi),使用要處理的圖像作為參數
在 JFrame 中放置這個(gè)要顯示圖片的 ImagePanel,并開(kāi)始偵聽(tīng)鼠標事件
下面我們定義用于處理鼠標事件的方法
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); }
說(shuō)明:
當鼠標按下時(shí)存儲當前坐標到 c1 和 c2
當鼠標按下并開(kāi)始拖動(dòng)時(shí)將拖動(dòng)狀態(tài)變量 drag_status 設置為 true
到鼠標按鍵松開(kāi)時(shí)表示圖像剪裁區域已經(jīng)選擇完畢,調用 draggedscreen 方法
paint 方法用于拖動(dòng)時(shí)候的矩形顯示,通過(guò)當前坐標和初始記錄的坐標來(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ō)明:
首先計算圖像的高度和寬度
使用 Robot 類(lèi)來(lái)對剪裁的區域進(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); } }
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站