关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » JAVA »Java图片剪裁并保存的代码实现

    Java图片剪裁并保存的代码实现

    2014-12-29 00:00:00 出处:developerWorks 中国
    分享

    这是一篇入门级文章,高手请略过。

    在这篇文章中我们将学习如何用 Java 对图像进行剪裁并将剪裁出来的部分单独保存到文件中。

    我们将通过以下步骤来学习:

    输入图像,指定要处理的图像路径 允许用户拖放要剪裁的部分 选择后使用 Robot 类来确定剪裁部分的坐标 剪裁所选图像并保持

    接下来我们开始编码部分。

    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;

    说明:

    Graphics 类包含绘制矩形的方法 我们使用 Rectangle 类作为拖拉的矩形区域以作剪裁 Robot 类用于捕获屏幕截图 使用鼠标侦听器来获取鼠标的拖拉时间 Robot 类使用 BufferedImage 来做图像处理 File 类用于打开图像文件 ImageIO 类用于将图像写到 png 或者 jpg 图像文件中 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();
    }

    说明:

    编写了一个名为 CropImage 的类 该类扩展了 JFrame 以实现 frame 的所有功能 实现了不同的鼠标事件侦听器以便知道用户什么时候开始拖动鼠标指针 drag_status 变量用于保存鼠标开始拖动时的坐标 我们定义了 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);
    }

    说明:

    我们定义一个名为 ImagePanel 的类,使用要处理的图像作为参数 在 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);
    
    }

    说明:

    当鼠标按下时存储当前坐标到 c1 和 c2 当鼠标按下并开始拖动时将拖动状态变量 drag_status 设置为 true 到鼠标按键松开时表示图像剪裁区域已经选择完毕,调用 draggedscreen 方法 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.");
    }}

    说明:

    首先计算图像的高度和宽度 使用 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 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);
    }
    }
    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    商业智能成CIO优先关注点 技术落地方显成效(1)

    用linux安装MySQL时产生问题破解

    JAVA中关于Map的九大问题

    windows 7旗舰版无法使用远程登录如何开启telnet服务

    Android View 事件分发机制详解

    MySQL用户变量的用法

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。