1. <strike id="voekh"><bdo id="voekh"></bdo></strike>
      <button id="voekh"><acronym id="voekh"></acronym></button>

      <s id="voekh"></s>

        <span id="voekh"></span>
      1. <li id="voekh"><acronym id="voekh"></acronym></li>
        <th id="voekh"></th>
        作家
        登錄

        如何在Java中進行圖片剪裁

        作者: 來源: 2012-08-10 23:59:35 閱讀 我要評論

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

        在這篇文章中我們將學習如何用 Java 對圖像進行剪裁并將剪裁出來的部分單獨保存到文件中。

        我們將通過以下步驟來學習:

        1. 輸入圖像,指定要處理的圖像路徑
        2. 允許用戶拖放要剪裁的部分
        3. 選擇后使用 Robot 類來確定剪裁部分的坐標
        4. 剪裁所選圖像并保持

        接下來我們開始編碼部分。

        Listing1: 引入的類

        1. import java.awt.Graphics;  
        2. import java.awt.Rectangle;  
        3. import java.awt.Robot;  
        4. import java.awt.event.MouseEvent;  
        5. import java.awt.event.MouseListener;  
        6. import java.awt.event.MouseMotionListener;  
        7. import java.awt.image.BufferedImage;  
        8. import java.io.File;  
        9. import javax.imageio.ImageIO;  
        10. import javax.swing.JFrame; 

        說明:

        1. Graphics 類包含繪制矩形的方法
        2. 我們使用 Rectangle 類作為拖拉的矩形區域以作剪裁
        3. Robot 類用于捕獲屏幕截圖
        4. 使用鼠標偵聽器來獲取鼠標的拖拉時間
        5. Robot 類使用 BufferedImage 來做圖像處理
        6. File 類用于打開圖像文件
        7. ImageIO 類用于將圖像寫到 png 或者 jpg 圖像文件中
        8. JFrame 用于顯示界面

        現在我們編寫包含 main 方法的入口類

        Listing2: 入口類

        1. public class CropImage extends JFrame implements MouseListener, MouseMotionListener  
        2. {  
        3.     int drag_status=0,c1,c2,c3,c4;  
        4. public static void main(String args[])  
        5. {  
        6.     new CropImage().start();  

        說明:

        1. 編寫了一個名為 CropImage 的類
        2. 該類擴展了 JFrame 以實現 frame 的所有功能
        3. 實現了不同的鼠標事件偵聽器以便知道用戶什么時候開始拖動鼠標指針
        4. drag_status 變量用于保存鼠標開始拖動時的坐標
        5. 我們定義了 main 方法去調用一個 start 方法,這個方法將在下面定義

        接下來是 start 方法

        Listing 2

        1. public void start()  
        2. {  
        3.     ImagePanel im=new ImagePanel("F:\Wallpaper\wallpapers\1.jpg");  
        4.     add(im);  
        5.     setSize(400,400);  
        6.     setVisible(true);  
        7.     addMouseListener(this);  
        8.     addMouseMotionListener( this );  
        9.     setDefaultCloseOperation(EXIT_ON_CLOSE);  

        說明:

        1. 我們定義一個名為 ImagePanel 的類,使用要處理的圖像作為參數
        2. 在 JFrame 中放置這個要顯示圖片的 ImagePanel,并開始偵聽鼠標事件

        下面我們定義用于處理鼠標事件的方法

        Listing 3: 鼠標事件處理函數

        1. @Override 
        2. public void mouseClicked(MouseEvent arg0) {  
        3. }  
        4.    
        5. @Override 
        6. public void mouseEntered(MouseEvent arg0) {  
        7. }  
        8.    
        9. @Override 
        10. public void mouseExited(MouseEvent arg0) {  
        11. }  
        12.    
        13. @Override 
        14. public void mousePressed(MouseEvent arg0) {  
        15.     repaint();  
        16.     c1=arg0.getX();  
        17.     c2=arg0.getY();  
        18. }  
        19.    
        20. @Override 
        21. public void mouseReleased(MouseEvent arg0) {  
        22.     repaint();  
        23.     if(drag_status==1)  
        24.     {  
        25.     c3=arg0.getX();  
        26.     c4=arg0.getY();  
        27.     try 
        28.     {  
        29.     draggedScreen();  
        30.     }  
        31.     catch(Exception e)  
        32.     {  
        33.         e.printStackTrace();  
        34.     }  
        35.     }  
        36. }  
        37.    
        38. @Override 
        39. public void mouseDragged(MouseEvent arg0) {  
        40.     repaint();  
        41.     drag_status=1;  
        42.     c3=arg0.getX();  
        43.     c4=arg0.getY();  
        44. }  
        45.  
        46. @Override 
        47. public void mouseMoved(MouseEvent arg0) {  
        48.        
        49. }  
        50.    
        51. public void paint(Graphics g)  
        52. {  
        53.     super.paint(g);  
        54.     int w = c1 - c3;  
        55.     int h = c2 - c4;  
        56.     w = w * -1;  
        57.     h = h * -1;  
        58.     if(w<0)  
        59.         w = w * -1;  
        60.     g.drawRect(c1, c2, w, h);  
        61.        

        說明:

        1. 當鼠標按下時存儲當前坐標到 c1 和 c2
        2. 當鼠標按下并開始拖動時將拖動狀態變量 drag_status 設置為 true
        3. 到鼠標按鍵松開時表示圖像剪裁區域已經選擇完畢,調用 draggedscreen 方法
        4. paint 方法用于拖動時候的矩形顯示,通過當前坐標和初始記錄的坐標來繪制矩形

        下面是 draggedscreen 方法的代碼

        Listing 4: draggedScreen 方法

        1. public void draggedScreen()throws Exception  
        2. {  
        3.         int w = c1 - c3;  
        4.         int h = c2 - c4;  
        5.         w = w * -1;  
        6.         h = h * -1;  
        7.         Robot robot = new Robot();  
        8.         BufferedImage img = robot.createScreenCapture(new Rectangle(c1, c2,w,h));  
        9.         File save_path=new File("screen1.jpg");  
        10.         ImageIO.write(img, "JPG", save_path);  
        11.     System.out.println("Cropped image saved successfully.");  
        12. }} 

        說明:

        1. 首先計算圖像的高度和寬度
        2. 使用 Robot 類來對剪裁的區域進行截圖并保持到另外一個文件 screen1.jpg

        完整的代碼

        Listing 5: ImagePanel.java

        1. import java.awt.Dimension;  
        2. import java.awt.Graphics;  
        3. import java.awt.Image;  
        4.    
        5. import javax.swing.ImageIcon;  
        6. import javax.swing.JPanel;  
        7.    
        8.     class ImagePanel extends JPanel {  
        9.    
        10.           private Image img;  
        11.    
        12.           public ImagePanel(String img) {  
        13.             this(new ImageIcon(img).getImage());  
        14.           }  
        15.    
        16.           public ImagePanel(Image img) {  
        17.             this.img = img;  
        18.             Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));  
        19.            // Dimension size = new Dimension(10,10);  
        20.             setPreferredSize(size);  
        21.             setMinimumSize(size);  
        22.             setMaximumSize(size);  
        23.             setSize(size);  
        24.             setLayout(null);  
        25.           }  
        26.    
        27.           public void paintComponent(Graphics g) {  
        28.             g.drawImage(img, 00null);  
        29.           }  
        30.    
        31.         } 

        Listing 6:CropImage.java

        1. import java.awt.Graphics;  
        2. import java.awt.Rectangle;  
        3. import java.awt.Robot;  
        4. import java.awt.event.MouseEvent;  
        5. import java.awt.event.MouseListener;  
        6. import java.awt.event.MouseMotionListener;  
        7. import java.awt.image.BufferedImage;  
        8. import java.io.File;  
        9. import javax.imageio.ImageIO;  
        10. import javax.swing.JFrame;  
        11.    
        12. public class CropImage extends JFrame implements MouseListener, MouseMotionListener  
        13. {  
        14.     int drag_status=0,c1,c2,c3,c4;  
        15. public static void main(String args[])  
        16. {  
        17.     new CropImage().start();  
        18. }  
        19. public void start()  
        20. {  
        21.     ImagePanel im=new ImagePanel("F:\Wallpaper\wallpapers\1.jpg");  
        22.     add(im);  
        23.     setSize(400,400);  
        24.     setVisible(true);  
        25.     addMouseListener(this);  
        26.     addMouseMotionListener( this );  
        27.     setDefaultCloseOperation(EXIT_ON_CLOSE);  
        28. }  
        29. public void draggedScreen()throws Exception  
        30. {  
        31.         int w = c1 - c3;  
        32.         int h = c2 - c4;  
        33.         w = w * -1;  
        34.         h = h * -1;  
        35.         Robot robot = new Robot();  
        36.         BufferedImage img = robot.createScreenCapture(new Rectangle(c1, c2,w,h));  
        37.         File save_path=new File("screen1.jpg");  
        38.         ImageIO.write(img, "JPG", save_path);  
        39.     System.out.println("Cropped image saved successfully.");  
        40. }  
        41. @Override 
        42. public void mouseClicked(MouseEvent arg0) {      
        43. }  
        44.    
        45. @Override 
        46. public void mouseEntered(MouseEvent arg0) {      
        47. }  
        48.    
        49. @Override 
        50. public void mouseExited(MouseEvent arg0) {       
        51. }  
        52.    
        53. @Override 
        54. public void mousePressed(MouseEvent arg0) {  
        55.     repaint();  
        56.     c1=arg0.getX();  
        57.     c2=arg0.getY();  
        58. }  
        59.    
        60. @Override 
        61. public void mouseReleased(MouseEvent arg0) {  
        62.     repaint();  
        63.     if(drag_status==1)  
        64.     {  
        65.     c3=arg0.getX();  
        66.     c4=arg0.getY();  
        67.     try 
        68.     {  
        69.     draggedScreen();  
        70.     }  
        71.     catch(Exception e)  
        72.     {  
        73.         e.printStackTrace();  
        74.     }  
        75.     }  
        76. }  
        77.    
        78. @Override 
        79. public void mouseDragged(MouseEvent arg0) {  
        80.     repaint();  
        81.     drag_status=1;  
        82.     c3=arg0.getX();  
        83.     c4=arg0.getY();  
        84. }  
        85.    
        86. @Override 
        87. public void mouseMoved(MouseEvent arg0) {  
        88.        
        89. }  
        90.    
        91. public void paint(Graphics g)  
        92. {  
        93.     super.paint(g);  
        94.     int w = c1 - c3;  
        95.     int h = c2 - c4;  
        96.     w = w * -1;  
        97.     h = h * -1;  
        98.     if(w<0)  
        99.         w = w * -1;  
        100.     g.drawRect(c1, c2, w, h);    
        101. }  

        英文原文:http://mrbool.com/how-to-crop-an-image-using-java/25272

        原文鏈接:http://www.oschina.net/question/12_63302

        【編輯推薦】

        1. Google App Engine的Java Facebook應用程序
        2. Java最優良的Adapter模式:適配器模式
        3. 如何快速成為JavaScript高手的思考
        4. Java SE 6 Hotspot虛擬機垃圾回收調優
        5. JavaScript寶座:七大框架論劍

          推薦閱讀

          你的代碼值多少錢 ?你算過嗎

        老板雇傭程序員來寫代碼,程序員的薪水是成本,產生的有效代碼是產品;蛘哒f老板從程序員那里買代碼。程序員每寫一行代碼究竟能賺多少錢?不妨來推導一下。我們規定程序員書寫、重構、改bug產生的變化行數都算做生產>>>詳細閱讀


        本文標題:如何在Java中進行圖片剪裁

        地址:http://www.hnbrwh.com/kaifa2/Java/11405.html

        關鍵詞: 探索發現

        樂購科技部分新聞及文章轉載自互聯網,供讀者交流和學習,若有涉及作者版權等問題請及時與我們聯系,以便更正、刪除或按規定辦理。感謝所有提供資訊的網站,歡迎各類媒體與樂購科技進行文章共享合作。

        網友點評
        自媒體專欄

        評論

        熱度

        精彩導讀
        欄目ID=71的表不存在(操作類型=0)
        成 人 黄 色 网站 小说 免费
        1. <strike id="voekh"><bdo id="voekh"></bdo></strike>
          <button id="voekh"><acronym id="voekh"></acronym></button>

          <s id="voekh"></s>

            <span id="voekh"></span>
          1. <li id="voekh"><acronym id="voekh"></acronym></li>
            <th id="voekh"></th>