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);   

}

(0)

相关推荐

  • 使用Java代码在Android中实现图片裁剪功能

    前言 Android应用中经常会遇到上传相册图片的需求,这里记录一下如何进行相册图片的选取和裁剪. 相册选取图片 1. 激活相册或是文件管理器,来获取相片,代码如下: private static final int TAKE_PICTURE_FROM_ALBUM = 1; private void takePictureFromAlbum() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("ima

  • java实现的图片裁剪功能示例

    本文实例讲述了java实现的图片裁剪功能.分享给大家供大家参考,具体如下: PicCut.java: package Tsets; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Iterator; import javax

  • Java实现图片上传到服务器并把上传的图片读取出来

    在很多的网站都可以实现上传头像,可以选择自己喜欢的图片做头像,从本地上传,下次登录时可以直接显示出已经上传的头像,那么这个是如何实现的呢? 下面说一下我的实现过程(只是个人实现思路,实际网站怎么实现的不太清楚) 实现的思路: 工具:MySQL,eclipse 首先,在MySQL中创建了两个表,一个t_user表,用来存放用户名,密码等个人信息, 一个t_touxiang表,用来存放上传的图片在服务器中的存放路径,以及图片名字和用户ID, T_touxiang表中的用户ID对应了t_user中的i

  • 详解Java中使用ImageIO类对图片进行压缩的方法

    最近做项目需要图片压缩处理,网上找的方法大都使用了 com.sun.image.codec.jpeg.* 这个包中的JPEGImageEncoder类,引入这个包后一直报错,各种google百度,尝试了各种方法,包括手动引jre中的rt.jar,以及在eclipse中把受访问限制的API提示从ERROR改为WARNING,等等,然而这些都是不好使的,因为后来我发现我的java-7-openjdk-amd64中的rt.jar里边根本就没有com.sun.image.*,貌似这个类在java7中已经

  • jquery.Jcrop结合JAVA后台实现图片裁剪上传实例

    本文介绍了头像裁剪上传功能,用到的技术有  jQuery,springmvc,裁剪插件用的是jcrop(中间遇到很多坑,最终跨越). 图片上传步骤: 1.用户选择图片 2.将图片传入后台:用户选择图片的时候选择的是各种各样的,但是我们的网页显示图片大小是有限的,所以我们就要在用户选择图片之后将图片添加到后台进行压缩,压缩成我们想要的大小,之后再显示到页面才好 3.利用jcrop裁剪工具对图片进行裁剪并且实时预览 4.点击确定按钮将裁剪用到的参数传入后台,后台图片进行剪切,之后缩放成我们需要的格式

  • Java图片裁剪和生成缩略图的实例方法

    一.缩略图 在浏览相册的时候,可能需要生成相应的缩略图. 直接上代码: public class ImageUtil { private Logger log = LoggerFactory.getLogger(getClass()); private static String DEFAULT_PREVFIX = "thumb_"; private static Boolean DEFAULT_FORCE = false;//建议该值为false /** * <p>Tit

  • JavaWeb实现裁剪图片上传完整代码

    本文实例为大家分享了JavaWeb实现裁剪图片上传完整案例,供大家参考,具体内容如下 实现思路 •使用jcrop插件手机要裁剪图片的坐标  •将收集到的参数传递到后台,在后台使用java图形对象绘制图像进行裁剪 ◦后台处理流程: 1.将上传的图片按按照比例进行压缩后上传到文件服务器,并且将压缩后的图片保存在本地临时目录中. 2.将压缩后的图片回显到页面,使用jcrop进行裁剪,手机裁剪坐标(x,y,width,height) ■@paramx 目标切片起点坐标X ■@param y 目标切片起点

  • java实现文件上传下载和图片压缩代码示例

    分享一个在项目中用的到文件上传下载和对图片的压缩,直接从项目中扒出来的:) 复制代码 代码如下: package com.eabax.plugin.yundada.utils; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.

  • Java实现图片与Base64编码互转

    淘宝里面的html用base64转换图片,不知道为什么,不过看起来好像很美好,话不多说,直接上代码: import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import sun.misc.BASE64Decoder; import sun.misc.BA

  • Java如何实现图片裁剪预览功能

    在项目中,我们需要做些类似头像上传,图片裁剪的功能,ok看下面文章! 需要插件:jQuery Jcrop 后端代码: package org.csg.upload; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Itera

随机推荐