浮士德html5图片裁剪器2016开源版

前言

最近刚刚好整理浮士德头像裁剪的flash版本,为了某些低级浏览器的兼容着想,既然已经做好了flash版本了,那么,现代浏览器的html5版本和ipad版,移动版也要做一些处理和打包。

兼容性

兼容ie10及以上,google浏览器,Firefox浏览器,safari浏览器,兼容ipad,苹果,安卓等机型。

历史文档

话说图片裁剪这个是很常见的需求,但是做到精细化和兼容处理也是相当费工夫的,本人光是博客相关文件都有7、8篇了,解决的大大小小bug不计其数,本插件不但解决了下面的各种bug,而且还将下面的各种插件集成了。

在触屏设备上面利用html5裁剪图片

利用exif js及脚本修正图片的orientation显示

一个利用html5的图片裁剪功能(已解决ios压扁缩放等bug)

megapix-image.js使用的一个坑-ios图片裁剪之画布绘制大图片

分享一个前端等比压缩图片插件

html5图片裁剪控件原型【含缩放,旋转,拖动功能】—1、控件设计

html5图片裁剪控件原型【含缩放,旋转,拖动功能】—2、核心代码

html5图片裁剪控件原型【含缩放,旋转,拖动功能】—3、实际演示效果

实际运行结果

话说裁剪界面是不丑的,但是演示界面就是简单的没有任何样式的页面,demo页面将就下。

demo运行代码

前端页面代码

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2016/5/19
  Time: 16:43
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title></title>
  <jsp:include page="inc.js.jsp"></jsp:include>

  <!--power image cut-->
  <link rel="stylesheet" type="text/css" href="/static/vendor/power-imgcut-v2/style.css"/>

  <script type="text/javascript" src="/static/vendor/power-imgcut-v2/js/exif.min.js"></script>
  <script type="text/javascript" src="/static/vendor/power-imgcut-v2/js/megapix-image.js"></script>
  <script type="text/javascript" src="/static/vendor/power-imgcut-v2/js/ImgCut2.min.js"></script>
  <script type="text/javascript" src="/static/vendor/power-imgcut-v2/main.js"></script>
</head>
<body>
<h2>请选择图片</h2>
<input type="file" id="uploadImage" >
<div  id="image-editor" style="display: none;">

</div>
<h2>本地裁剪图片</h2>
<img id="usercenter_avatar"/>
<h2>服务端图片</h2>
<img id="preview-image" >

  <script type="text/javascript">
    $(function(){
              //--获取窗口高度及宽度,尽量别超出窗口。
              var _e_width = $(window).width() - 200;
              var _e_height = $(window).height() - 200;
              if (_e_width > 800) {
                _e_width = 800;
              }
              else if (_e_width <300) {
                _e_width = 300;
              }
              _e_height=400;
              _e_width=400;
              //--这是控件的课配置参数。
              var opts = {
                cutWidth: 200 //裁剪框的宽度。
                , cutHeight: 200 //裁剪框的高度
                , containerWidth: _e_width //容器宽度
                , containerHeight: _e_height //容器高度
                , imageShowWidth: 300 //图片默认显示的宽度【会按照要求的宽度及高度等比缩放】
                , imageShowHeight: 300 //图片默认显示的高度【会按照要求的宽度及高度等比缩放】
                ,imageEditorElement:$("#image-editor")
                ,onSave:function(imgData){
                  $.ajax({
                    url:"/service/saveBase64Image.jsp"
                    ,data:{
                      file:imgData
                    }
                    ,method:"post"
                    ,dataType:"json"
                    ,success:function(sdata){
                      _imageHandler.hideEditor();
                      if(sdata.error==0){
                        $("#usercenter_avatar").attr("src",imgData);
                        $("#preview-image").attr("src",sdata.url);
                        var _notice=new NotificationFx({
                          type:"success"
                          ,message:"成功修改头像"
                        });
                        _notice.show();
                      }
                      else{
                        var _notice=new NotificationFx({
                          type:"error"
                          ,message:sdata.message
                        });
                        _notice.show();
                      }
                    }

                  });
                }//当用户点击保存按钮要保存图片数据时候的回调函数。
                ,onBtnResetClick:function(){
                  if(_imageHandler){
                    _imageHandler.hideEditor();
                  }
                  $("#panel-form").show();
                }//reset按钮点击以后。

              };

              var _imageHandler=ImageEditorHandler(opts);

              //--逻辑方法定义
              $("#uploadImage").change(function(){

                if (document.getElementById("uploadImage").files.length === 0) {
                  alert("请选择图片!");
                  return; }
                var oFile = document.getElementById("uploadImage").files[0];
                //if (!rFilter.test(oFile.type)) { alert("You must select a valid image file!"); return; }

                /*  if(oFile.size>5*1024*1024){
                 message(myCache.par.lang,{cn:"照片上传:文件不能超过5MB!请使用容量更小的照片。",en:"证书上传:文件不能超过100K!"})
                 changePanel("result");
                 return;
                 }*/
                if(!new RegExp("(jpg|jpeg|gif|png)+","gi").test(oFile.type)){
                  alert("照片上传:文件类型必须是JPG、JPEG、PNG或GIF!");
                  return;
                }

                var reader = new FileReader();

                reader.onload =function(e){
                  var _img_str=e.target.result;
                  // img 元素
                  $("#panel-form").hide();
                  _imageHandler.init(_img_str,oFile);

                };
                reader.readAsDataURL(oFile);
                return;
              });
            }
    );

</script>
</body>
</html>

后台接收代码–主要是接收base64字符串

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.*,java.io.*" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.*" %>
<%@ page import="org.apache.commons.fileupload.servlet.*" %>
<%@ page import="com.alibaba.fastjson.JSONObject" %>
<%@ page import="sun.misc.BASE64Decoder" %>
<%

  /**
   * KindEditor JSP
   *
   * 本JSP程序是演示程序,建议不要直接在实际项目中使用。
   * 如果您确定直接使用本程序,使用之前请仔细确认相关安全设置。
   *
   */

//文件保存目录路径
  String savePath = application.getRealPath("/") + "uploads/";

//文件保存目录URL
  String saveUrl  = request.getContextPath() + "/uploads/";

//检查目录
  File uploadDir = new File(savePath);
  if(!uploadDir.isDirectory()){
    uploadDir.mkdirs();
  }
  if(!uploadDir.isDirectory()){
    out.println(getError("上传目录不存在。"));
    return;
  }
//检查目录写权限
  if(!uploadDir.canWrite()){
    out.println(getError("上传目录没有写权限。"));
    return;
  }

  String dirName = request.getParameter("dir");
  if (dirName == null) {
    dirName = "image";
  }

//创建文件夹
  savePath += dirName + "/";
  saveUrl += dirName + "/";
  File saveDirFile = new File(savePath);
  if (!saveDirFile.exists()) {
    saveDirFile.mkdirs();
  }
  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
  String ymd = sdf.format(new Date());
  savePath += ymd + "/";
  saveUrl += ymd + "/";
  File dirFile = new File(savePath);
  if (!dirFile.exists()) {
    dirFile.mkdirs();
  }

  SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
  String newFileName = df.format(new Date()) + "_" + new Random().nextInt(1000) + "." + ".jpg";

  String file=request.getParameter("file");

  if(file==null||file.isEmpty()){

    out.println(getError("找不到key为file的base64字符串"));
    return;
  }

  String realBase64="";
  //--将data:image/jpeg;base64,这种形式过滤掉。
  if(file.indexOf(‘,‘)!=-1){
    realBase64=file.substring(file.indexOf(‘,‘)+1);
  }
  else{
    realBase64=file;
  }

  //base64解码。。
  BASE64Decoder decoder = new BASE64Decoder();
  try {
    File uploadedFile = new File(savePath, newFileName);

    FileOutputStream write = new FileOutputStream(uploadedFile);
    byte[] decoderBytes = decoder.decodeBuffer(realBase64);
    write.write(decoderBytes);
    write.close();

    out.println(getSuccess(saveUrl+"/"+newFileName));

  } catch (IOException e) {
    e.printStackTrace();
    out.println(getError("上传失败"));
  }

%>
<%!
  private String getError(String message) {
    JSONObject obj = new JSONObject();
    obj.put("error", 1);
    obj.put("message", message);
    return obj.toJSONString();
  }
  private String getSuccess(String url) {
    JSONObject obj = new JSONObject();
    obj.put("error", 0);
    obj.put("url", url);
    return obj.toJSONString();
  }
%>

相关资源下载

浮士德html5图片裁剪器打包下载

浮士德html5图片裁剪器

后记

假如需要进行一些比较大的变动或者大家对一些原理不理解,可以来信询问,我不定时上线。

时间: 2024-08-02 00:14:40

浮士德html5图片裁剪器2016开源版的相关文章

HTML5动画图片播放器 高端大气

我们见过很多图片播放插件(焦点图),很多都基于jQuery.今天介绍的HTML5图片播放器很特别,它不仅在图片间切换有过渡动画效果,而且在切换时图片中的元素也将出现动画效果,比如图中的文字移动.打散.重新组合等.这款HTML5动画图片播放器算得上是高端大气上档次. 在线演示源码下载 转载自:http://www.html5tricks.com/html5-image-player-with-animation.html HTML5动画图片播放器 高端大气

Jquery插件-Html5图片上传并裁剪

/** * 图片裁剪 * @author yanglizhe * 2015/11/16 */ (function($){ /** * Drag */ var Drag={obj:null,init:function(elementHeader,element){elementHeader.onmousedown=Drag.start;elementHeader.obj=element;if(isNaN(parseInt(element.style.left))){element.style.le

最新 IOS应用开发Icon规格自动裁剪器(C#)

老早之前做IOS APP开发,为折腾一个IOS应用的Icon,用C#写了一个简单的IOS应用开发Icon规格自动裁剪器,但时过境迁,目前IOS设备屏幕规格也是越来越多,一个版本就要生成好几种规格分辨率的Icon,用PS什么的一个一个生成费劲,如果Icon有变动又得重新生成一次,所以还是整个程序来干这活比较轻松. 思路很简单,先导入一张大图(注意:这张图必须大于等于1024*1024,因为[email protected]的规格是1024*1024),然后生成对应像素的小图,最后保存出来. 首先来

Android大图片裁剪终极解决方案 原理分析

约几个月前,我正为公司的APP在Android手机上实现拍照截图而烦恼不已. 上网搜索,确实有不少的例子,大多都是抄来抄去,而且水平多半处于demo的样子,可以用来讲解知识点,但是一碰到实际项目,就漏洞百出. 当时我用大众化的解决方案,暂时性的做了一个拍照截图的功能,似乎看起来很不错.问题随之而来,我用的是小米手机,在别的手机上都运行正常,小米这里却总是碰钉子.虽然我是个理性的米粉,但是也暗地里把小米的工程师问候了个遍.真是惭愧! 翻文档也找不出个答案来,我一直对com.android.came

Plyr – 简单,灵活的 HTML5 媒体播放器

Plyr 是一个简单的 HTML5 媒体播放器,包含自定义的控制选项和 WebVTT 字幕.它是只支持现代浏览器,轻量,方便和可定制的媒体播放器.还有的标题和屏幕阅读器的全面支持. 在线演示      源码下载 您可能感兴趣的相关文章 网站开发中很有用的 jQuery 效果[附源码] 分享35个让人惊讶的 CSS3 动画效果演示 十分惊艳的8个 HTML5 & JavaScript 特效 Web 开发中很实用的10个效果[源码下载] 12款经典的白富美型 jQuery 图片轮播插件 本文链接:P

图片裁剪

图片裁剪代码: -(UIImage*)getSubImage:(UIImage*)image rect:(CGRect)rect { CGRect newrect = CGRectMake(0, 0, rect.size.width*2, rect.size.height*2); CGImageRef subImageRef = CGImageCreateWithImageInRect(image.CGImage, newrect); UIGraphicsBeginImageContext(re

HTML5图片预览

作者:Snandy 两种方式实现 URL FileReader 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 <!DOCTYPE HTML> <html>     <head>     <meta charset="utf

iOS边练边学--(Quartz2D)图片裁剪,带圆环的裁剪

一.图片裁剪,示意图 二.带圆环的图片裁剪示意图

Java实现图片裁剪预览功能

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