利用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下利用fso判断文件是否存在的代码
Dec 11 Javascript
JavaScript中判断对象类型的几种方法总结
Nov 11 Javascript
前端必备神器 Snap.svg 弹动效果
Nov 10 Javascript
使用JavaScript获取地址栏参数的方法
Dec 19 Javascript
JS获取时间的方法
Jan 21 Javascript
JavaScript删除数组元素的方法
Mar 20 Javascript
Javascript的动态增加类的实现方法
Oct 20 Javascript
写给小白看的JavaScript异步
Nov 29 Javascript
浅谈vue引入css,less遇到的坑和解决方法
Jan 20 Javascript
js操作二进制数据方法
Mar 03 Javascript
Vue 动态组件components和v-once指令的实现
Aug 30 Javascript
js之切换全屏和退出全屏实现代码实例
Sep 09 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中使用灵巧的体系结构
2006/10/09 PHP
在同一窗体中使用PHP来处理多个提交任务
2008/05/08 PHP
php自动获取字符串编码函数mb_detect_encoding
2011/05/31 PHP
一个简洁的PHP可逆加密函数(分享)
2013/06/06 PHP
php获取字符串中各个字符出现次数的方法
2015/02/23 PHP
PHP实现连接设备、通讯和发送命令的方法
2015/10/13 PHP
PHP数组式访问接口ArrayAccess用法分析
2017/12/28 PHP
使用户点击后退按钮使效三行代码
2007/07/07 Javascript
javascript基础第一章 JavaScript与用户端
2010/07/22 Javascript
使用JS实现jQuery的addClass, removeClass, hasClass函数功能
2014/10/31 Javascript
第二章之Bootstrap 页面排版样式
2016/04/25 Javascript
Web开发中客户端的跳转与服务器端的跳转的区别
2017/03/05 Javascript
ECMAScript6变量的解构赋值实例详解
2017/09/19 Javascript
vue项目如何刷新当前页面的方法
2018/05/18 Javascript
利用PHP实现递归删除链表元素的方法示例
2020/10/23 Javascript
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
python正则表达式re模块详解
2014/06/25 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
2016/06/16 Python
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
python框架flask表单实现详解
2019/11/04 Python
django创建超级用户时指定添加其它字段方式
2020/05/14 Python
python实现自动清理重复文件
2020/08/24 Python
Django nginx配置实现过程详解
2020/09/10 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
2020/12/05 Python
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
Famous Footwear加拿大:美国多品牌运动休闲鞋店
2018/12/05 全球购物
留学生如何写好自荐信
2013/12/27 职场文书
医院检讨书范文
2014/02/01 职场文书
消防安全检查制度
2014/02/04 职场文书
文明寄语大全
2014/04/11 职场文书
如何撰写一封出色的求职信
2014/04/27 职场文书
弄虚作假心得体会
2014/09/10 职场文书
家长高考寄语
2015/02/27 职场文书
热爱劳动主题班会
2015/08/14 职场文书
员工聘用合同范本
2015/09/21 职场文书
音乐研修感悟
2015/11/18 职场文书