最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java裁剪圖片并保存的示例分享

 更新時(shí)間:2014年01月03日 11:34:21   作者:  
在這篇文章中我們將學(xué)習(xí)如何用Java 對(duì)圖像進(jìn)行剪裁并將剪裁出來(lái)的部分單獨(dú)保存到文件中

我們將通過(guò)以下步驟來(lái)學(xué)習(xí):

輸入圖像,指定要處理的圖像路徑
允許用戶(hù)拖放要剪裁的部分
選擇后使用 Robot 類(lèi)來(lái)確定剪裁部分的坐標(biāo)
剪裁所選圖像并保持
接下來(lái)我們開(kāi)始編碼部分。

Listing1: 引入的類(lèi)

復(fù)制代碼 代碼如下:

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)作為拖拉的矩形區(qū)域以作剪裁
Robot 類(lèi)用于捕獲屏幕截圖
使用鼠標(biāo)偵聽(tīng)器來(lái)獲取鼠標(biāo)的拖拉時(shí)間
Robot 類(lèi)使用 BufferedImage 來(lái)做圖像處理
File 類(lèi)用于打開(kāi)圖像文件
ImageIO 類(lèi)用于將圖像寫(xiě)到 png 或者 jpg 圖像文件中
JFrame 用于顯示界面

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

Listing2: 入口類(lèi)

復(fù)制代碼 代碼如下:

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)擴(kuò)展了 JFrame 以實(shí)現(xiàn) frame 的所有功能
實(shí)現(xiàn)了不同的鼠標(biāo)事件偵聽(tīng)器以便知道用戶(hù)什么時(shí)候開(kāi)始拖動(dòng)鼠標(biāo)指針
drag_status 變量用于保存鼠標(biāo)開(kāi)始拖動(dòng)時(shí)的坐標(biāo)
我們定義了 main 方法去調(diào)用一個(gè) start 方法,這個(gè)方法將在下面定義

接下來(lái)是 start 方法

Listing 2

復(fù)制代碼 代碼如下:

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),使用要處理的圖像作為參數(shù)
在 JFrame 中放置這個(gè)要顯示圖片的 ImagePanel,并開(kāi)始偵聽(tīng)鼠標(biāo)事件


下面我們定義用于處理鼠標(biāo)事件的方法

Listing 3: 鼠標(biāo)事件處理函數(shù)

復(fù)制代碼 代碼如下:

@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ō)明:

當(dāng)鼠標(biāo)按下時(shí)存儲(chǔ)當(dāng)前坐標(biāo)到 c1 和 c2
當(dāng)鼠標(biāo)按下并開(kāi)始拖動(dòng)時(shí)將拖動(dòng)狀態(tài)變量 drag_status 設(shè)置為 true
到鼠標(biāo)按鍵松開(kāi)時(shí)表示圖像剪裁區(qū)域已經(jīng)選擇完畢,調(diào)用 draggedscreen 方法
paint 方法用于拖動(dòng)時(shí)候的矩形顯示,通過(guò)當(dāng)前坐標(biāo)和初始記錄的坐標(biāo)來(lái)繪制矩形

下面是 draggedscreen 方法的代碼

復(fù)制代碼 代碼如下:

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ō)明:

首先計(jì)算圖像的高度和寬度
使用 Robot 類(lèi)來(lái)對(duì)剪裁的區(qū)域進(jìn)行截圖并保持到另外一個(gè)文件 screen1.jpg

完整的代碼

復(fù)制代碼 代碼如下:

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)文章

  • SpringCloud將Nacos作為配置中心實(shí)現(xiàn)流程詳解

    SpringCloud將Nacos作為配置中心實(shí)現(xiàn)流程詳解

    這篇文章主要介紹了Springcloud中的Nacos Config服務(wù)配置,本文以用戶(hù)微服務(wù)為例,進(jìn)行統(tǒng)一的配置,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • Java數(shù)組轉(zhuǎn)List及Stream的基本方法使用方法

    Java數(shù)組轉(zhuǎn)List及Stream的基本方法使用方法

    Java?的?Stream?流操作是一種簡(jiǎn)潔而強(qiáng)大的處理集合數(shù)據(jù)的方式,允許對(duì)數(shù)據(jù)進(jìn)行高效的操作,如過(guò)濾、映射、排序和聚合,這篇文章主要介紹了Java數(shù)組轉(zhuǎn)List及Stream的基本方法使用教程,需要的朋友可以參考下
    2024-08-08
  • Map按單個(gè)或多個(gè)Value排序當(dāng)Value相同時(shí)按Key排序

    Map按單個(gè)或多個(gè)Value排序當(dāng)Value相同時(shí)按Key排序

    Map可以先按照value進(jìn)行排序,然后按照key進(jìn)行排序。 或者先按照key進(jìn)行排序,然后按照value進(jìn)行排序,這樣操作都行,這篇文章主要介紹了Map按單個(gè)或多個(gè)Value排序,當(dāng)Value相同時(shí)按Key排序,需要的朋友可以參考下
    2023-02-02
  • SpringBoot?整合?Spring-Session?實(shí)現(xiàn)分布式會(huì)話(huà)項(xiàng)目實(shí)戰(zhàn)

    SpringBoot?整合?Spring-Session?實(shí)現(xiàn)分布式會(huì)話(huà)項(xiàng)目實(shí)戰(zhàn)

    本文主要介紹了SpringBoot?整合?Spring-Session?實(shí)現(xiàn)分布式會(huì)話(huà)項(xiàng)目實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • java使用IO流對(duì)數(shù)組排序?qū)嵗v解

    java使用IO流對(duì)數(shù)組排序?qū)嵗v解

    在本篇文章里小編給大家整理的是一篇關(guān)于java使用IO流對(duì)數(shù)組排序?qū)嵗v解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-02-02
  • Hibernate實(shí)現(xiàn)many-to-many的映射關(guān)系

    Hibernate實(shí)現(xiàn)many-to-many的映射關(guān)系

    今天小編就為大家分享一篇關(guān)于Hibernate實(shí)現(xiàn)many-to-many的映射關(guān)系,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • 基于Java向zip壓縮包追加文件

    基于Java向zip壓縮包追加文件

    這篇文章主要介紹了基于Java向zip壓縮包追加文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java中Spring擴(kuò)展點(diǎn)詳解

    Java中Spring擴(kuò)展點(diǎn)詳解

    這篇文章主要介紹了Java中Spring技巧之?dāng)U展點(diǎn)的應(yīng)用,下文Spring容器的啟動(dòng)流程圖展開(kāi)其內(nèi)容的相關(guān)資料,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • 二維碼生成Java實(shí)現(xiàn)代碼

    二維碼生成Java實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了二維碼生成Java實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • MyBatis-Plus如何通過(guò)注解使用TypeHandler

    MyBatis-Plus如何通過(guò)注解使用TypeHandler

    這篇文章主要介紹了MyBatis-Plus如何通過(guò)注解使用TypeHandler,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評(píng)論

尼木县| 合川市| 北流市| 建宁县| 霍林郭勒市| 江永县| 益阳市| 乌恰县| 城固县| 水富县| 江达县| 齐齐哈尔市| 塔河县| 大石桥市| 上饶县| 光泽县| 通山县| 曲靖市| 扎囊县| 涡阳县| 白银市| 花垣县| 交城县| 刚察县| 邵武市| 马龙县| 乐都县| 甘洛县| 永年县| 卢湾区| 马公市| 鄂伦春自治旗| 华容县| 山西省| 沙雅县| 泰顺县| 佳木斯市| 凉城县| 安新县| 遵化市| 娱乐|