利用Javascript裁剪图片并存储的简单实现


Posted in Javascript onMarch 13, 2017

前言

就我而言,页面上的设计比较灵动的部分,其实不是很多,诸如滑动验证码,图片裁剪等比较好的交互设计。

从刚开始工作的时候,我就想把这些东西了解下,无奈一直没这个需求,乘着今天的空闲,研究了一下午,期间遇到了大大小小的问题,一直备受折磨,这其实也反映一个问题,我的

还是比较薄弱。

实现效果:

用户点击上传图片后,页面显示所上传的图片,并且出现裁剪框和两个预览区域,最后点击裁剪按钮保存裁剪的图片到服务器上。 

效果很简单,整个过程我遇到的两个难点,第一个是裁剪的JS效果,第二个则是图片数据的处理。 

对于第一个问题,我引用了网上的一个插件,就我感觉来说,裁剪过程用户的满意度只能算一般,因为它只能裁剪正方形区域,就算边框上有八个拉动设置,但是拉动框时还是按正方形缩放,就这点不太让我满意。

实现方法如下: 

以下是简单的页面设计:

<div style="float:left;"><img id="target"></div>
<div style="width:48px;height:48px;margin:10px;overflow:hidden; float:left;"><img style="float:left;" id="preview" ></div>
<div style="width:190px;height:195px;margin:10px;overflow:hidden; float:left;"><img style="float:left;" id="preview2" ></div>
<form action="{:U('/test/crop_deal')}" method="post" onsubmit="return checkCoords()" enctype="multipart/form-data" id="form">
<input type="file" name="file" onchange="change_image(this)">
<input type="hidden" id="x" name="x" />
<input type="hidden" id="y" name="y" />
<input type="hidden" id="w" name="w" />
<input type="hidden" id="h" name="h" />
<input type="submit" value="裁剪"/>
</form>

下面是JS代码:

function change_image(file){
var reader = new FileReader();
reader.onload = function(evt){
$("#target").attr('src',evt.target.result);
$('#preview').attr('src',evt.target.result);
$('#preview2').attr('src',evt.target.result);
// $('#target').css({"height":"600px","width":"600px"});
// 限制了大小会影响到截图的效果
};
reader.readAsDataURL(file.files[0]);

var jcrop_api, boundx, boundy;

setTimeout(function(){


$('#target').Jcrop({
minSize: [48,48],
setSelect: [0,0,190,190],
onChange: updatePreview,
onSelect: updatePreview,
onSelect: updateCoords,
aspectRatio: 1
},
function(){
// Use the API to get the real image size
var bounds = this.getBounds();
boundx = bounds[0];
boundy = bounds[1];
// Store the API in the jcrop_api variable
jcrop_api = this;
});

function updatePreview(c){
if (parseInt(c.w) > 0)
{
var rx = 48 / c.w; //小头像预览Div的大小
var ry = 48 / c.h;

$('#preview').css({
width: Math.round(rx * boundx) + 'px',
height: Math.round(ry * boundy) + 'px',
marginLeft: '-' + Math.round(rx * c.x) + 'px',
marginTop: '-' + Math.round(ry * c.y) + 'px'
});
}
{
var rx = 199 / c.w; //大头像预览Div的大小
var ry = 199 / c.h;
$('#preview2').css({
width: Math.round(rx * boundx) + 'px',
height: Math.round(ry * boundy) + 'px',
marginLeft: '-' + Math.round(rx * c.x) + 'px',
marginTop: '-' + Math.round(ry * c.y) + 'px'
});
}
};


function updateCoords(c)
{
$('#x').val(c.x);
$('#y').val(c.y);
$('#w').val(c.w);
$('#h').val(c.h);
};

},500);

}

这里稍作两点提醒:

其一:不要忘记在页面头部引入插件:

<script src="/plug/js/jquery.min.js" type="text/javascript"></script>

<script src="/plug/js/jquery.Jcrop.min.js" type="text/javascript"></script>

<link rel="stylesheet" href="/plug/css/Jcrop.css" rel="external nofollow" type="text/css" />

其二:有些人眼尖的话可能看到了JS里有个定时,同时心理是不是很疑惑这不是有点多此一举吗?其实不是,上传图片到JS加载到页面上,是需要时间的,这个定时的意义在于

等到图片被JS加载到页面上时才去加载裁剪效果,这里也是反复实验后得出的做法。 

后端PHP处理我用的是THINKPHP框架,版本是3.1.3

贴上代码:

function crop_deal(){
ob_clean();

import ( 'ORG.Net.UploadFile' );

$upload = new UploadFile ();

$upload->maxSize = 2000000;

$upload->allowExts = array (


'jpg',


'gif',


'png',


'jpeg'

);

$upload->savePath = './upload/test/';

$upload->autoSub = true;

$upload->subType = 'date';

$upload->dateFormat = 'Ymd';

if ($upload->upload () ) {


$info = $upload->getUploadFileInfo();


$new_path = "./upload/test/thumb".date('Ymd');


$file_store = $new_path."/".date('YmdHis').".jpg";


if(!file_exists($new_path)){



mkdir($new_path,0777,true);


}


$source_path = "http://".$_SERVER['HTTP_HOST']."/upload/test/".$info[0]['savename'];


$img_size = getimagesize($source_path);


$width = $img_size[0];


$height = $img_size[1];



$mime = $img_size['mime'];


$srcImg = imagecreatefromstring(file_get_contents($source_path));


$cropped_img = imagecreatetruecolor($_POST['w'], $_POST['h']);


//缩放


// imagecopyresampled($cropped_img,$srcImg,0,0,$_POST['x'],$_POST['y'],$_POST['w'],$_POST['h'],$width,$height);


//裁剪


imagecopy($cropped_img,$srcImg,0,0,$_POST['x'],$_POST['y'],$_POST['w'],$_POST['h']);


header("Content-Type:image/jpeg");


imagejpeg($cropped_img,$file_store);


imagedestroy($srcImg);


imagedestroy($cropped_img);

}

}

这里就是调用GD库里创建图像的一系列方法,最重要就是imagecopy() ,它是将原图按规定的裁剪位置,裁剪大小复制到新的图片上去,这也说明了一件事,页面用户在裁剪图片

的时候其实前端并没有对图片操作,而是得到裁剪时的坐标位置,裁剪大小,然后提交到PHP操作!!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者使用Swift能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
深入理解javaScript中的事件驱动
May 21 Javascript
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
Aug 08 Javascript
深入探讨JavaScript String对象
Mar 09 Javascript
jQuery中animate动画第二次点击事件没反应
May 07 Javascript
js实现兼容IE、Firefox的图片缩放代码
Dec 08 Javascript
Vuex之理解Getters的用法实例
Apr 19 Javascript
从parcel.js打包出错到选择nvm的全部过程
Jan 23 Javascript
mpvue构建小程序的方法(步骤+地址)
May 22 Javascript
Vue实现页面添加水印功能
Nov 09 Javascript
uni-app 组件里面获取元素宽高的实现
Dec 27 Javascript
详解使用mocha对webpack打包的项目进行&quot;冒烟测试&quot;的大致流程
Apr 27 Javascript
微信小程序自定义顶部组件customHeader的示例代码
Jun 03 Javascript
js实现手机发送验证码功能
Mar 13 #Javascript
Javascript封装id、class与元素选择器方法示例
Mar 13 #Javascript
原生js实现吸顶效果
Mar 13 #Javascript
vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
Mar 13 #Javascript
jquery.flot.js简单绘制折线图用法示例
Mar 13 #Javascript
深入理解Node.js中的进程管理
Mar 13 #Javascript
jQuery简易时光轴实现方法示例
Mar 13 #Javascript
You might like
php的header和asp中的redirect比较
2006/10/09 PHP
用PHP和ACCESS写聊天室(七)
2006/10/09 PHP
PHP服务器页面间跳转实现方法
2012/08/02 PHP
解析PHP中empty is_null和isset的测试
2013/06/29 PHP
php实现utf-8转unicode函数分享
2015/01/06 PHP
PHP计算百度地图两个GPS坐标之间距离的方法
2015/01/09 PHP
PHP通过get方法获得form表单数据方法总结
2018/09/12 PHP
浅析Prototype的模板类 Template
2011/12/07 Javascript
JS获取select的value和text值的简单实例
2014/02/26 Javascript
jQuery的几个我们必须了解的特点
2015/05/03 Javascript
prototype.js常用函数详解
2016/06/18 Javascript
webpack下实现动态引入文件方法
2018/02/22 Javascript
JavaScript复制内容到剪贴板的两种常用方法
2018/02/27 Javascript
Vue filter格式化时间戳时间成标准日期格式的方法
2018/09/16 Javascript
js实现随机div颜色位置 类似满天星效果
2019/10/24 Javascript
vue路由传参的基本实现方式小结【三种方式】
2020/02/05 Javascript
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
python创建和删除目录的方法
2015/04/29 Python
快速解决安装python没有scripts文件夹的问题
2018/04/03 Python
不知道这5种下划线的含义,你就不算真的会Python!
2018/10/09 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
基于python-opencv3的图像显示和保存操作
2019/06/27 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
Django自定义用户表+自定义admin后台中的字段实例
2019/11/18 Python
Python 数据的累加与统计的示例代码
2020/08/03 Python
Django生成数据库及添加用户报错解决方案
2020/10/09 Python
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
班组安全员工作职责
2014/02/01 职场文书
应届生求职自荐信范文
2014/04/07 职场文书
关于环保的标语
2014/06/13 职场文书
班子群众路线教育实践个人对照检查材料思想汇报
2014/09/30 职场文书
2014财务部年度工作总结
2014/12/08 职场文书
复兴之路观后感3000字
2015/06/02 职场文书
导师鉴定意见
2015/06/05 职场文书
离婚民事起诉状
2015/08/03 职场文书
趣味运动会标语口号
2015/12/26 职场文书