功能:

1.通过jquery.form上传图片,并按一定比例显示预览图。

2.通过Jcrop裁剪图片,并显示裁剪预览图

3.通过CI的图像处理类保存剪切后图片

问题:

1.通过jquery.form来ajax提交file类的神奇问题

2.获取ajax加载图片后图片尺寸的问题

3.按比例伸缩图片

4.ajax获取图片后绑定Jcrop

5.CI中upload类注意事项

6.图片裁剪原理

html页面代码:

头像:

crop_photo.js代码:

//首先是保证jquery.form能ajax提交图片

!function($){

$(function(){

$("#form_photo").ajaxForm();//ajaxForm()只是绑定表单事件,并不是提交表单。。。

$("#button_photo").click(function(){

//判断上传格式,判断图片大小好像只能在服务端检测,所以预览图片必须先传上去

var options = {

success: showResponse,//上传成功回调函数

};

$("#form_photo").ajaxSubmit(options);//ajax上传图片,转由CI部分upload_photo

//方法处理。另外,我上传file一直没有成功

//过jquery.form官方文档中的submit()中再

//回调函数ajaxForm()的方式,这种方法ajax

//提交其它表单没问题

});

function showResponse(data){

//根据返回值判断上传是否成功

//成功返回图片路径

//jquery添加

//jquery添加

//现在开始准备

init_photo();//初始化jcrop

$("#button_photo").click(function(){

$("#save_photo").submit();//再次上传剪切后图片参数到CI部分save_photo方法 });

}

var photo_width = 292;//设置显示预览图片的最大尺寸

var photo_height = 292;

function init_photo(){

var k = 0;//记录图片伸缩比例

var screen_img = $("#jcrop_photo");//通过new_img获取ajax加载的图片

var new_img = new Image(); //直接获取ajax加载图片的尺寸有问题

new_img.src = screen_img.attr("src");//反正我是这样才获得了真实的尺寸

setTimeout(function(){ //由于图片加载时间,可能要通过

//挂起一段时间后才能读取图片尺寸

if((new_img.height/292) >= (new_img.width/292)){//限定长或宽最大为292

$("#jcrop_photo").css("height",292);

photo_width = Math.round(new_img.width*292/new_img.height);

$("#jcrop_photo").css("width",photo_width);

k = new_img.height/292;

}else{

$("#jcrop_photo").css("width",292);

photo_height = Math.round(new_img.height*292/new_img.width);

$("#jcrop_photo").css("height",photo_height);

k = new_img.width/292;

}

$("#p_k").val(k); //将伸缩比例传给hidden表单

$('#jcrop_photo').Jcrop({//绑定Jcrop到图片,必须在此刻绑定

onChange: show_preview,//剪切预览图 //这时候图片的DOM才被获取,不要在

onSelect: show_preview, //ready的时候绑定,也不要jquery添

aspectRatio: 1, //加

});

},100);

}

function show_preview(coords){ //显示剪切后图片预览

if (parseInt(coords.w) > 0){

var i_k = 146 / coords.w; //146为设置的预览图区域大小

$("#preview").css({

"height": (i_k * photo_height) + 'px', //Jcrop官方文档中给出的是

"width": (i_k * photo_width) + 'px', //指定的图片长宽,这也就是

"marginLeft": '-' + (i_k * coords.x) + 'px', //为什么要获得真实图片尺寸

"marginTop": '-' + (i_k * coords.y) + 'px',//的原因,具体图片原理见后文

}).show();

$("#p_x").val(coords.x);//将剪切位置传给hidden表单

$("#p_y").val(coords.y);

$("#p_h").val(coords.h);

$("#p_w").val(coords.w);

}

}

});

}(window.jQuery)

php代码

upload_photo方法 //ajax上传图片

$config['upload_path'] = './img/user_head';

$config['allowed_types'] = 'gif|jpg|png';

$config['max_size'] = '4096';

$config['encrypt_name'] = true;

$this->load->library('upload', $config);//加载upload类

if(!$this->upload->do_upload('photo_src')){ //一定要写表单对应字段

echo 0; //失败返回给ajax请求0

}else{

$data = $this->upload->data();

echo $data['file_name'];//成功后返回相对路径+图片名

}

save_photo方法//生产裁剪后图片

$config['image_library'] = 'gd2';

$config['source_image'] = $_POST['photo_url'];

$config['new_image'] = './img/user_head/'.'用户ID'.'.jpg';

$config['maintain_ratio'] = FALSE;//保证设置的长宽有效

$config['x_axis'] = $_POST['p_x']*$_POST['p_k']; //一定要乘以p_k,因为这里存放的

$config['y_axis'] = $_POST['p_y']*$_POST['p_k']; //是原图而不是浏览器上经过缩放的

$config['width'] = $_POST['p_w']*$_POST['p_k'];//的图

$config['height'] = $_POST['p_h']*$_POST['p_k'];

//$this->load->library('image_lib', $config);

if ( ! $this->image_lib->crop())

{

echo $this->image_lib->display_errors();

}else{

//裁剪完毕

}

至此已经完成图片上传并裁剪保存功能,下面图解一下图片裁剪原理

jcrop裁剪后预览原理

注意图片的边长应该是上传图片大小除以比例K,即p.h/k。这关系到后来服务器端裁剪图片。

c.x,c.y,c.h,c.w等为jcrop提供的参数,分别是裁剪点离原图片左上角x方向距离,y方向距离,裁剪高度,宽度。

对于显示裁剪区域图片,首先要把图片缩放,缩放比例为js代码中show_preview方法的i_k,然后移动位置,将放在

中,隐藏不必要显示的部分。

CI裁剪图片原理

$config['x_axis'] :据图像左上角x轴距离

$config['y_axis'] :据图像左上角y轴距离

$config['width']:裁剪的宽度

$config['height']:裁剪的长度

所以根据传来的数值,都应在相对的p_x等乘以p_k,即,比如$config['x_axis'] = $_POST['p_x']*$_POST['p_k'];

php ci 处理图片 裁剪,jquery.form + Jcrop + CI框架实现图片裁剪上传相关推荐

  1. jquery.form.js java_使用jQuery.form.js/springmvc框架实现文件上传功能

    使用的技术有jquery.form.js框架, 以及springmvc框架.主要实现异步文件上传的同时封装对象,以及一些注意事项. 功能本身是很简单的,但是涉及到一些传递参数类型的问题.例如:jque ...

  2. jquery实现截取pc图片_Cropper.js 实现裁剪图片并上传(PC端)

    由于之前做项目的时候有需求是需要实现裁剪图片来做头像并上传到服务器,所以上网查询了很多资料,也试用了许多案例,发现cropper插件裁剪是比较完善的,所以结合之前的使用情况,编写了此案例.本案例是参考 ...

  3. asp.net实现图片在线上传并在线裁剪

    1.说明 接上一篇文章uploadify实现多附件上传完成后,又突然用到头像上传并在线裁剪.在网上找个众多例子都没有符合要求的,有一篇文章写的不错,就是文旺老兄写的这篇Asp.Net平台下的图片在线裁 ...

  4. jquery插件课程2 放大镜、多文件上传和在线编辑器插件如何使用

    jquery插件课程2 放大镜.多文件上传和在线编辑器插件如何使用 一.总结 一句话总结:插件使用真的还是比较简单的,引包,初始化,配置参数(json),配置数据(json),而后两步不是必须的.而且 ...

  5. 续《用最简单的例子实现jQuery图片即时上传》之多图上传实现

    本用例主要含两个文件(index.html.submit_form_process.php),一个文件夹(files/).特别的,files中含一个报错图片error.jpg,jquery库引用了外链 ...

  6. html5在线裁剪,HTML5 本地裁剪图片并上传至服务器(老梗)

    很多情况下用户上传的图片都需要经过裁剪,比如头像啊什么的.但以前实现这类需求都很复杂,往往需要先把图片上传到服务器,然后返回给用户,让用户确定裁剪坐标,发送给服务器,服务器裁剪完再返回给用户,来回需要 ...

  7. 使用ajax提交form表单,包括ajax文件上传 转http://www.cnblogs.com/zhuxiaojie/p/4783939.html...

    使用ajax提交form表单,包括ajax文件上传 前言 使用ajax请求数据,很多人都会,比如说: $.post(path,{data:data},function(data){... },&quo ...

  8. react-cropper + antdesign +dva 实现裁剪图片并上传的功能

    react-cropper + antdesign +dva 实现裁剪图片并上传的功能 一.首先安装react-cropper插件 npm install --save react-cropper 执 ...

  9. cropper.js 实现裁剪图片并上传(PC端)

    博客地址:http://blog.mambaxin.com 由于之前做项目的时候有需求是需要实现裁剪图片来做头像并上传到服务器,所以上网查询了很多资料,也试用了许多案例,发现cropper插件裁剪是比 ...

最新文章

  1. MyEclipse 9.0 正式版公布新闻 下载
  2. Windows 全局钩子 Hook 详解
  3. jax-rs jax-ws_信守承诺:针对JAX-RS API的基于合同的测试
  4. Vue Axios的配置 (高仿饿了么)
  5. emacs org 日历_发送电子邮件并使用Emacs检查您的日历
  6. 【iOS-Cocos2d游戏开发之八】开启高清(960*640)模式问题与解答、图片适配以及设置iphone横竖屏...
  7. fopen文件路径怎么写_php的多功能文件操作类
  8. java8 Stream接口简单使用
  9. SecureCRT的下载、安装、使用( 过程非常详细~)
  10. 南邮-2022年6月电子商务练习自整理 - 选择篇
  11. 服务器运行cad慢,cad启动很慢的三种解决方法
  12. 服务器四核cpu性能排行,服务器cpu性能排行
  13. 超详细TMS-EEG数据处理教程(下)
  14. 《C程序设计语言》笔记 第6章 结构
  15. 热爱生活,从电影开始
  16. c语言 异或 浮点数存储 分支结构
  17. 怎么还原计算机字体库,如何在XP系统中恢复字库文件?WinXp系统恢复字库文件图文教程...
  18. Appium使用swipe定位滚动列表和滚动屏幕元素
  19. 世界观和方法论——青山行客
  20. 职业规划系列:软件工程师的十大层次

热门文章

  1. 用python使用py2neo时候报“ModuleNotFoundError:No module named 'py2neo'”的错误
  2. 二义性和C++消除二义性
  3. C# Socket网络编程精华篇 (转)
  4. 几个常见网络故障修复命令
  5. 【WebService】Caused by: org.apache.cxf.transport.http.HTTPException: HTTP respon ...
  6. 贝叶斯法则的举例分析
  7. 使用思维导图进行产品需求分析
  8. 微信小程序手机号绑定功能(登录后绑定)
  9. 小程序 - 微信授权登录 微信授权绑定手机号
  10. Springsecurity+cas整合后无法单点登出