JS+JAVA裁图

本文主要介绍Java层面对图片进行裁剪的过程,下面的实例没有截图动画,如需截图动画及其他要求可使用JCROP

JCROP地址: http://deepliquid.com/content/Jcrop.html

具体实例如下:

取照片,以(0,0)坐标开始,以较短边为正方形边长,截取最大正方形。

js代码:

function cutImage(name) { //name为裁剪图片名称
  var image = new Image();
  image.src = imgUrl + "/" + name; //图片全路径
  image.onload = function() {
  var s;
  if (image.width <= image.height) {
    s = image.width;
  } else {
    s = image.height;
  }
  var param = {};
  param.x = 0;
  param.y = 0;
  param.w = s;
  param.h = s;
  param.bigImage = image.src;
  $.ajax({
    url : config.SERVER_URL + ‘/common/cutImage‘,
    type : ‘POST‘,
    contentType : ‘application/x-www-form-urlencoded‘,
    data : param,
    success : function(e, data) {
      if (e.status != 200) {
        alert( "上传失败");
        return;
      }
      alert( "上传成功");
     },
    error : function(e) {
      alert( "上传失败");
    }
  });
}
}

后台Java:

@RequestMapping(value = "/cutImage", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
/** "裁剪图片" *  bigImage:需裁剪图片路径  *  x : 坐标X轴起点  *  y : 坐标Y轴起点  *  w : 截取宽度  *  h : 截取高度  */
    public SimpleResponse cutImage(@RequestParam("bigImage") String bigImage, @RequestParam("x") String x,
            @RequestParam("y") String y, @RequestParam("w") String w, @RequestParam("h") String h) {
        File file = null;
        try {
            int xInt = Integer.valueOf(x);
            int yInt = Integer.valueOf(y);
            int wInt = Integer.valueOf(w);
            int hInt = Integer.valueOf(h);

            // 文件正式路径
            String imagePath = bigImage;
            // 切割图片
            ImageCut imageCut = new ImageCut();
            file = imageCut.cutImage(imagePath, xInt, yInt, wInt, hInt);

            byte[] bytes =FileUtils.readFileToByteArray(file);
            // 上传剪裁后的文件
            return uploadPicture(bytes);

        } catch (Exception e) {
            throw new LiveException(LiveCode.FILE_UPLOAD_ERROR);
        } finally {
            FileUtils.deleteQuietly(file);
        }
    }

工具类:

package com.utils;

import javax.imageio.ImageIO;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

public class ImageCut {

     /**
     * 图片切割
     * @param imagePath  原图地址
     * @param x  目标切片坐标 X轴起点
     * @param y  目标切片坐标 Y轴起点
     * @param w  目标切片 宽度
     * @param h  目标切片 高度
     */
    public File cutImage(String imagePath, int x ,int y ,int w,int h){
        File file = null;
        File imageFile = null;
        try {
            Image img;
            ImageFilter cropFilter;
            imageFile = loadFile(imagePath);    //因为图片地址为URL,需先下载图片到本地

            // 读取源图像
            BufferedImage bi = ImageIO.read(imageFile);
            int srcWidth = bi.getWidth();      // 源图宽度
            int srcHeight = bi.getHeight();    // 源图高度  

            //若原图大小大于切片大小,则进行切割
            if (srcWidth >= w && srcHeight >= h) {
                Image image = bi.getScaledInstance(srcWidth, srcHeight,Image.SCALE_DEFAULT);  

                cropFilter = new CropImageFilter(x, y, w, h);
                img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(image.getSource(), cropFilter));
                BufferedImage tag = new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB);
                Graphics g = tag.getGraphics();
                g.drawImage(img, 0, 0, null); // 绘制缩小后的图
                g.dispose();
                // 输出为文件
                file = new File(System.getProperty("user.dir")+"final"+ System.currentTimeMillis() +".jpg");   //用时间戳作为文件名可以避免并发问题
                ImageIO.write(tag, "JPEG", file);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            FileUtils.deleteQuietly(imageFile);
        }
        return file;
    }  

    public File loadFile(String imagePath){
        URLConnection con = null;
        OutputStream os = null;
        InputStream is = null;
        File file = null;
        try {
            // 构造URL
            URL url = new URL(imagePath);
            // 打开连接
            con = url.openConnection();
            // 输入流
            is = con.getInputStream();
            // 1K的数据缓冲
            byte[] bs = new byte[1024];
            // 读取到的数据长度
            int len;
           file = new File(System.getProperty("user.dir")+"template"+ System.currentTimeMillis() +".jpg");
            // 输出的文件流
            os = new FileOutputStream(file);
            // 开始读取
            while ((len = is.read(bs)) != -1) {
                os.write(bs, 0, len);
            }
            os.flush();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            // 完毕,关闭所有链接
            IOUtils.close(con);
            IOUtils.closeQuietly(is);
            IOUtils.closeQuietly(os);
        }

        return file;
    }

}
时间: 2024-10-26 14:09:11

JS+JAVA裁图的相关文章

大数据技术之_18_大数据离线平台_02_Nginx+Mysql+数据收集+Web 工程 JS/JAVA SDK 讲解+Flume 故障后-如何手动上传 Nginx 日志文件至 HDFS 上

十一.Nginx11.1.介绍11.2.常见其他 Web 服务器11.3.版本11.4.Nginx 安装11.5.目录结构11.6.操作命令十二.Mysql12.1.介绍12.2.关系型数据库(SQL)种类12.3.特征12.4.术语12.4.与非关系型数据库比较(Not Only SQL)12.4.1.种类12.4.2.特征12.4.3.总结十三.数据收集13.1.收集方式13.2.数据的事件类型13.2.1.Launch 事件13.2.2.PageView 事件13.3.Nginx 日志收集

[JAVA]Socket 图片流的传输

import java.io.DataInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { System.out.

如何使用JS实现banner图滚动

通过JS实现banner图的滚动主要是定时器的应用 先新建好banner图的几张图片,最后一张与第一张用同一个,保证滚动的不间断 改好样式,需注意所有图片要在同行显示,否则不能向左滚动 声明一个函数,为定时器函数,函数内通过switch结构执行,case的值通过声明一个全局变量每次执行函数的时候使其自加,通过执行函数的次数来确定banner图向左移动多少的距离.需注意第5次要使全局变量归零才能使定时器内的switch结构无限循环,在样式表中可以设置过渡效果,使滚动更有节奏感 接下来实现banne

js,java,浮点数运算错误及应对方法

js,java,浮点数运算错误及应对方法 一,浮点数为什么会有运算错误 IEEE 754 标准规定了计算机程序设计环境中的二进制和十进制的浮点数自述的交换.算术格式以及方法. 现有存储介质都是2进制.2进制的进制基数是2,那么一个数字只要被因素包含大于2的质数的数除,都会产生无限循环小数.无限循环小数和无理数都无法,和非无限循环的有理数一起用同一种方式存储到存储介质上的同时还保持计算的兼容性. 对于无限循环小数,可以设计一种格式存储到介质上,但是同时又要和非无限循环的有理数能够计算,效率应该会变

Java甘特图控件swing版免费下载地址 &nbsp; &nbsp; &nbsp;

FlexGantt 控件是现在Java 平台下最先进的甘特图解决方案,使用一个很高的抽象层次,能适用于多种不同的域,例如 ERP 系统.生产计划和日程安排.制造流程系统或项目公文管理程序等.这些使得 FlexGantt 能从其他有局限性的项目计划(资源.人.任务)甘特图库中脱颖而出. 具体功能: 原文来自http://www.51diaodu.com/pdt/2966 模型视图控制器:FlexGantt 遵从与 Swing 相同 MVC 方法.许多不同的模型用于各种各样的用途.一个日历模型跟踪假

利用d3.js绘制雷达图

利用d3,js将数据可视化,可以做到数据与代码的分离,方便以后修改数据. 这次利用d3.js绘制了一个五维的雷达图,即将多个对象的五种属性在一张图上对比. 数据写入data.csv.数据类型写入type.csv文件. 效果如下图所示 源码连接:http://download.csdn.net/detail/svap1/7358123 使用是只需调用 radar()函数即可,如下是测试页面代码. <!DOCTYPE html> <html> <head> <meta

java之图形化界面(GUI)

一.概述 用户与计算机进行交换的方式有两种: GLI:Command lin User Interface(命令行用户接口),也就是常见的dos窗口,它需要记住一些常用的命令,操作不直观方便. GUI:Graphical User Interface(图形用户接口),用图形的方式,来显示计算机操作的界面,这样更方便直观. 这两种交换方式就对应两种交互界面:命令行界面和图形化界面. 现在图形化界面是主流. Java为GUI提供的对象都在java.awt和javax.swing这两个包中. Awt和

JS 实现banner图的滚动和选择效果

CSS+JS实现banner图滚动和点击切换 HTML 部分代码: <body> <div id="banner"> <div id="inside"><img src="img/banner1.png" id="img1" /><img src="img/banner2.png" id="img2" /><img src

java Swing图形化界面

学过java的人应该对java的图形化界面很是反感,特别是接触java不久的人.如果想和其他语言那样用鼠标拖拽,可以使用wondosbulider插件.但是用起来也不是那么方便.当然对于不乐意写代码的人来说真是太幸福了. 然而用代码去实现java的图形化界面并非那么麻烦.总结起来就是~ 1.定义你需要使用的面板,按钮,文本,标签. 2.对这些实例化.  然后把按钮,文本,标签按照你想要的方法放到面板上. 3.把面板放在界面上.  如果界面简单的话,面板也是可以不使用的,面板可以方便管理一些按钮.