关闭 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);
    }
    }
    上一篇返回首页 下一篇

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

    别人在看

    电脑屏幕不小心竖起来了?别慌,快捷键搞定

    Destoon 模板存放规则及语法参考

    Destoon系统常量与变量

    Destoon系统目录文件结构说明

    Destoon 系统安装指南

    Destoon会员公司主页模板风格添加方法

    Destoon 二次开发入门

    Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持

    Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处

    Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...

    IT头条

    Synology 更新 ActiveProtect Manager 1.1 以增强企业网络弹性和合规性

    00:43

    新的 Rubrik Agent Cloud 加速了可信的企业 AI 代理部署

    00:34

    宇树科技 G1人形机器人,拉动一辆重达1.4吨的汽车

    00:21

    Cloudera 调查发现,96% 的企业已将 AI 集成到核心业务流程中,这表明 AI 已从竞争优势转变为强制性实践

    02:05

    投资者反对马斯克 1 万亿美元薪酬方案,要求重组特斯拉董事会

    01:18

    技术热点

    大型网站的 HTTPS 实践(三):基于协议和配置的优化

    ubuntu下右键菜单添加新建word、excel文档等快捷方式

    Sublime Text 简明教程

    用户定义SQL Server函数的描述

    怎么在windows 7开始菜单中添加下载选项?

    SQL Server 2016将有哪些功能改进?

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

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