当前位置: 首页 » 综合知识 » it知识 » 正文

Java如何实现一个图片剪裁功能

发布时间:2023-07-25 以下文章来源于网友投稿,内容仅供参考!

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;

说明:

  1. Graphics 类包含绘制矩形的方法

  2. 我们使用 Rectangle 类作为拖拉的矩形区域以作剪裁

  3. Robot 类用于捕获屏幕截图

  4. 使用鼠标侦听器来获取鼠标的拖拉时间

  5. Robot 类使用 BufferedImage 来做图像处理

  6. File 类用于打开图像文件

  7. ImageIO 类用于将图像写到 png 或者 jpg 图像文件中

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

说明:

  1. 编写了一个名为 CropImage 的类

  2. 该类扩展了 JFrame 以实现 frame 的所有功能

  3. 实现了不同的鼠标事件侦听器以便知道用户什么时候开始拖动鼠标指针

  4. drag_status 变量用于保存鼠标开始拖动时的坐标

  5. 我们定义了 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);  }

说明:

  1. 我们定义一个名为 ImagePanel 的类,使用要处理的图像作为参数

  2. 在 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);         }

说明:

  1. 当鼠标按下时存储当前坐标到 c1 和 c2

  2. 当鼠标按下并开始拖动时将拖动状态变量 drag_status 设置为 true

  3. 到鼠标按键松开时表示图像剪裁区域已经选择完毕,调用 draggedscreen 方法

  4. 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.");  }}

说明:

  1. 首先计算图像的高度和宽度

  2. 使用 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 painponent(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);    }  }
  • • Linux Ecdsa密钥长度选择有何依据

    在Linux

  • • Linux Khook在内核监控中的应用如何

    Linux

  • • Linux Gsoap是否支持异步通信

    GSOAP是

  • • Linux Coremail如何提升用户体验

    提升Linu

  • • Linux Ecdsa算法有哪些局限性

    ECDSA

  • 哎呀音乐钢琴键盘学习《 钢琴主人训练营》 西瓜学琴
    郭蝈 陪练钢琴 30节课时 考级刚需 让孩子每一次练琴都是高质量的
    30天轻松学会五线谱 流行钢琴自学初级教程 牙牙学琴
    流行爵士钢琴实战技巧VIP课 - 继伟 哎呀音乐
    【海上钢琴师】原版 MT1990钢琴谱
    百首经典流行钢琴实战曲集 - 继伟
    雷费尔德电钢琴重锤88键专业考级儿童初学者数码电子钢琴家用
    小练咖 真人钢琴陪练 1v1服务 2999随时退 1课时50分钟 考级刚需
    雅马哈电钢琴88键重锤CLP735智能数码电子钢琴家用专业初学者考级
    【原装进口】Yamaha/雅马哈钢琴 b121 SC2原声静音钢琴
  • 珠海专业调钢琴
  • 天津宝坻区调钢琴
  • 天津静海区钢琴调音
  • 成都简阳市钢琴调律
  • 大连瓦房店市钢琴调音
  • 眉山调钢琴联系方式
  • 惠州大亚湾钢琴调琴师
  • 长治调琴师
  • 厦门湖里区钢琴调音师
  • 上海普陀区钢琴调音师