cropper+pillow处理上传图片剪裁(一)
在写新博客的时候,遇到需要用户上传自定义图片的处理,查了一番资料,决定用cropper和pillow来处理需要剪裁的图片上传,大致思路是:前端收集用户上传的图片和用户剪裁的尺寸数据,后台接收图片后按数据进行剪裁保存,但是剪裁的临时文件我还没有想出一个比较合理的办法,这里只记录前期的简单实现
一.cropper
github: https://github.com/fengyuanchen/cropper
这里我按教程引入了
cropper.min.css
cropper.min.js
但是会报错,TypeError: image.cropper is not a function直到我引入了这个解决了报错问题,此外他们都是依赖jquery的
jquery-cropper.min.js
{#cropper编辑区域#}
<div class="avatar-wrapper" id='avatar-wrapper'>
<img src="">
</div>
{#头像预览区域#}
<div class="avatar-preview" style=" border-radius: 15%">
<img style="width: 96px; height: 96px;" src="">
</div>
{#上传按钮#}
<a id="upload" class="btn btn-primary">上传头像</a>
<label class="btn btn-primary" for="avatar-input">选择图片</label>
{#form#}
<form action="" method="post" id="avatar_form" enctype="multipart/form-data">
{%csrf_token%}
<input style="display:none" type="file" class="avatar-input" id="avatar-input" name="avatar_file" accept=".jpg,.jpeg,.png">
<input type="hidden" id="avatar_x" name="avatar_x">
<input type="hidden" id="avatar_y" name="avatar_y">
<input type="hidden" id="avatar_width" name="avatar_width">
<input type="hidden" id="avatar_height" name="avatar_height">
</form>
模板的主要内容就是这些,主要是编辑区域、预览区域、上传按钮和隐藏的form组成,其中预览区域可以根据自己的需求先展示原头像或者默认头像,通过js将图片和尺寸数据保存在隐藏的form中上传到后台
cropper的初始化:
var image = $('#avatar-wrapper img');
image.cropper({
checkImageOrigin: true, //检查图片来源
dragMode: 'move', //图片可移动
restore:false, //窗体调整大小之后不自动恢复裁剪区域
zoomOnWheel: false, //不允许通过鼠标滚轮缩放
zoomOnTouch: false, //不允许通过触摸缩放
aspectRatio: 1 / 1, //裁剪比例
autoCropArea: 0.5, //裁剪背景透明度
autoCropArea: 1, //自动裁剪的比例
preview: ".avatar-preview",//预览区域
crop: function (e) {
//返回图片编辑相关数据
$('#avatar_x').val(e.detail.x);
$('#avatar_y').val(e.detail.y);
$('#avatar_width').val(e.detail.width);
$('#avatar_height').val(e.detail.height);
},
});
图片上传到cropper进行剪裁:
$("#avatar-input").change(function(){
var URL = window.URL || window.webkitURL;
if(URL){
var files = this.files;
if (files && files.length){
var file = files[0];
if (/^image\/\w+$/.test(file.type)) {
var blobURL = URL.createObjectURL(file);
image.cropper('reset').cropper('replace', blobURL);
$('.avatar_crop .disabled').removeClass('disabled');
} else {
alert('请选择一张图片');
}
}
}
});
上传到后台:(我使用的jquery-form.js插件,普通的ajax方法也可以)
$('#upload').click(function () {
if($('#avatar-wrapper img').attr('src')==''){
$('#infoModal h4').html('请先选择一个图片')
$('#infoModal').modal('show')
return false;}
var $form=$("#avatar_form")
$form.ajaxSubmit(function (headpicaddress) {
})
二.pillow
def user_my_info_headpic(request):
# 剪裁数据获取
top = int(float(request.POST['avatar_y']))
buttom = top + int(float(request.POST['avatar_height']))
left = int(float(request.POST['avatar_x']))
right = left + int(float(request.POST['avatar_width']))
# 图片临时保存
with open(os.path.join(settings.BASE_DIR, "test1.jpg"), "wb") as f:
for line in request.FILES['avatar_file']:
f.write(line) # 打开图片
im = Image.open(os.path.join(settings.BASE_DIR, "test1.jpg"))
# 剪裁图片
crop_im = im.crop((left, top, right, buttom))
# 保存图片
crop_im.save(os.path.join(settings.BASE_DIR, "test2.jpg"))
return HttpResponse("ok")
这是我的view方法,路由部分省略了,只是简单的保存在一个临时位置,后面我会整理出一个更合理的方法和完整的流程
cropper+pillow处理上传图片剪裁(一)的更多相关文章
- cropper+pillow处理上传图片剪裁(二)
上次说到处理上传头像的方法是临时保存在本地,其实这样做并不妥,而且修改后的头像重新上传到model中也很麻烦,差了很多资料,解决了这个问题 大致思路:用户上传原图和修改数据—PIL修改后将图片保存为内 ...
- 基于layui+cropper.js实现上传图片的裁剪功能
最近因项目需求,需要在上传图片的时候先对图片裁剪,然后在上传,所以就有了本文的出现. 开始正文之前,要提一下这个图片的裁剪:图片的裁剪,有前端裁剪,也可以后端裁剪 前端的裁剪我知道的可以分为这么两种: ...
- 图片剪裁上传插件 - cropper
图片剪裁上传插件 - cropper <style> .photo-container{float: left;width: 300px;height: 300px;} .photo-co ...
- 插件介绍 :cropper是一款使用简单且功能强大的图片剪裁jQuery插件。
简要教程 cropper是一款使用简单且功能强大的图片剪裁jQuery插件.该图片剪裁插件支持图片放大缩小,支持鼠标滚轮操作,支持图片旋转,支持触摸屏设备,支持canvas,并且支持跨浏览器使用. c ...
- cropper图片剪裁 , .toBlob()报错
问题描述: 使用 cropper.js 剪裁图片时, 调用 toBlob() 方法报错 $("#image").cropper('getCroppedCanvas').toBlob ...
- C#MVC和cropper.js实现剪裁图片ajax上传的弹出层
首先使用cropper.js插件,能够将剪裁后的图片返回为base64编码,后台根据base64编码解析保存图片. jQuery.cropper: 是一款使用简单且功能强大的图片剪裁jquery插件 ...
- jquery头像上传剪裁插件cropper的前后台demo
因为一个项目要做一个头像上传的功能,因此选择了使用jquery的头像插件cropper,cropper是一款使用简单且功能强大的图片剪裁jQuery插件,但是在使用的时候,有一个很大的坑需要注意,那就 ...
- 使用cropper插件裁剪并上传图片(Spring mvc)
cropper是一款使用简单且功能强大的图片剪裁jQuery插件.该图片剪裁插件支持图片放大缩小,支持图片旋转,支持触摸屏设备,支持canvas,并且支持跨浏览器使用. cropper有两种方式上传截 ...
- 上传图片截图预览控件不显示cropper.js 跨域问题
上传图片到图片服务器,因为域名不同,多以会有跨域问题. No 'Access-Control-Allow-Origin' header is present on the requested reso ...
随机推荐
- 【剑指Offer】60、把二叉树打印成多行
题目描述: 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 解题思路: 本题可类比第22题:从上往下打印二叉树,这两道题实际上是一回事,只不过这里我们多了一个分行打印 ...
- C#第二节课
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- Linux浅谈磁盘管理及案例
磁盘管理 MBR原理图 从该图可理解到为什么主分区只能是四个. 可以不分区,但为了统一管理,提高访问效率 设备不同,生成设备名称不同 管理分区命令: lsblk查看块设备 fdisk创建MBR分区 f ...
- 高举 Vue-SSR
将同一个组件渲染为服务器端的 HTML 字符串,将它们直接发送到浏览器,最后将静态标记"混合"为客户端上完全交互的应用程序. SSR的目的 To solve 首屏渲染问题 SEO问 ...
- PHP统计当前在线用户数实例
HTML 我们在页面上放置一个显示当前在线人数的div#total以及一个用于展示访客地区分布的列表#onlinelist,默认我们在列表中放置一张与加载动画图片,后面我们用jQuery控制当鼠标滑向 ...
- delphi主i窗口中实现多页面管理效果
MainForm上加Panel,把Panel的DockSite设为True, 把窗口FB_orderManage的DragKind设为dkDock, DragMode设为dmAuromatic 在M ...
- SIGPROF和SIGALRM使用总结
这几天,被公司的两个模块的程序好好的搞了一下,开始以为是SHELL的问题,仔细研究了以下,原来没有想象的那么复杂!!! 关键在使用的信号SIGALRM 上,两个进程都用可SIGALRM 信 ...
- Javascript 基础夯实 —— 使用 webWorker 实现多线程(转)
原文链接:https://zhuanlan.zhihu.com/p/29219879 当我们开始学习 javascript 的时候,我们就知道 js 其实是单线程的,所以当我们在浏览器中运行某些耗时算 ...
- mysql备份恢复中的常见错误
从A主机备份到B主机 mysqldump -uroot -p vw>vw.sql 现备份数据库文件,需要恢复到目标机B,B的数据库版本为5.5.23,A机器的mysql版本为5.0.2 ...
- nginx中父子进程工作的主体函数
依据Nginx(0.7.67版本号)的代码.对Nginx主要的进程创建,进程主体以及事件处理进行了简要的分析. 基本上,父进程(即主进程)一開始会初始化及读取配置.并载入各模块的功能,然后fork() ...