在写新博客的时候,遇到需要用户上传自定义图片的处理,查了一番资料,决定用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处理上传图片剪裁(一)的更多相关文章

  1. cropper+pillow处理上传图片剪裁(二)

    上次说到处理上传头像的方法是临时保存在本地,其实这样做并不妥,而且修改后的头像重新上传到model中也很麻烦,差了很多资料,解决了这个问题 大致思路:用户上传原图和修改数据—PIL修改后将图片保存为内 ...

  2. 基于layui+cropper.js实现上传图片的裁剪功能

    最近因项目需求,需要在上传图片的时候先对图片裁剪,然后在上传,所以就有了本文的出现. 开始正文之前,要提一下这个图片的裁剪:图片的裁剪,有前端裁剪,也可以后端裁剪 前端的裁剪我知道的可以分为这么两种: ...

  3. 图片剪裁上传插件 - cropper

    图片剪裁上传插件 - cropper <style> .photo-container{float: left;width: 300px;height: 300px;} .photo-co ...

  4. 插件介绍 :cropper是一款使用简单且功能强大的图片剪裁jQuery插件。

    简要教程 cropper是一款使用简单且功能强大的图片剪裁jQuery插件.该图片剪裁插件支持图片放大缩小,支持鼠标滚轮操作,支持图片旋转,支持触摸屏设备,支持canvas,并且支持跨浏览器使用. c ...

  5. cropper图片剪裁 , .toBlob()报错

    问题描述: 使用 cropper.js 剪裁图片时, 调用 toBlob() 方法报错 $("#image").cropper('getCroppedCanvas').toBlob ...

  6. C#MVC和cropper.js实现剪裁图片ajax上传的弹出层

     首先使用cropper.js插件,能够将剪裁后的图片返回为base64编码,后台根据base64编码解析保存图片. jQuery.cropper: 是一款使用简单且功能强大的图片剪裁jquery插件 ...

  7. jquery头像上传剪裁插件cropper的前后台demo

    因为一个项目要做一个头像上传的功能,因此选择了使用jquery的头像插件cropper,cropper是一款使用简单且功能强大的图片剪裁jQuery插件,但是在使用的时候,有一个很大的坑需要注意,那就 ...

  8. 使用cropper插件裁剪并上传图片(Spring mvc)

    cropper是一款使用简单且功能强大的图片剪裁jQuery插件.该图片剪裁插件支持图片放大缩小,支持图片旋转,支持触摸屏设备,支持canvas,并且支持跨浏览器使用. cropper有两种方式上传截 ...

  9. 上传图片截图预览控件不显示cropper.js 跨域问题

    上传图片到图片服务器,因为域名不同,多以会有跨域问题. No 'Access-Control-Allow-Origin' header is present on the requested reso ...

随机推荐

  1. 【剑指Offer】60、把二叉树打印成多行

      题目描述:   从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行.   解题思路:   本题可类比第22题:从上往下打印二叉树,这两道题实际上是一回事,只不过这里我们多了一个分行打印 ...

  2. C#第二节课

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  3. Linux浅谈磁盘管理及案例

    磁盘管理 MBR原理图 从该图可理解到为什么主分区只能是四个. 可以不分区,但为了统一管理,提高访问效率 设备不同,生成设备名称不同 管理分区命令: lsblk查看块设备 fdisk创建MBR分区 f ...

  4. 高举 Vue-SSR

    将同一个组件渲染为服务器端的 HTML 字符串,将它们直接发送到浏览器,最后将静态标记"混合"为客户端上完全交互的应用程序. SSR的目的 To solve 首屏渲染问题 SEO问 ...

  5. PHP统计当前在线用户数实例

    HTML 我们在页面上放置一个显示当前在线人数的div#total以及一个用于展示访客地区分布的列表#onlinelist,默认我们在列表中放置一张与加载动画图片,后面我们用jQuery控制当鼠标滑向 ...

  6. delphi主i窗口中实现多页面管理效果

    MainForm上加Panel,把Panel的DockSite设为True, 把窗口FB_orderManage的DragKind设为dkDock,  DragMode设为dmAuromatic 在M ...

  7. SIGPROF和SIGALRM使用总结

    这几天,被公司的两个模块的程序好好的搞了一下,开始以为是SHELL的问题,仔细研究了以下,原来没有想象的那么复杂!!!       关键在使用的信号SIGALRM 上,两个进程都用可SIGALRM 信 ...

  8. Javascript 基础夯实 —— 使用 webWorker 实现多线程(转)

    原文链接:https://zhuanlan.zhihu.com/p/29219879 当我们开始学习 javascript 的时候,我们就知道 js 其实是单线程的,所以当我们在浏览器中运行某些耗时算 ...

  9. mysql备份恢复中的常见错误

        从A主机备份到B主机 mysqldump -uroot  -p vw>vw.sql 现备份数据库文件,需要恢复到目标机B,B的数据库版本为5.5.23,A机器的mysql版本为5.0.2 ...

  10. nginx中父子进程工作的主体函数

    依据Nginx(0.7.67版本号)的代码.对Nginx主要的进程创建,进程主体以及事件处理进行了简要的分析. 基本上,父进程(即主进程)一開始会初始化及读取配置.并载入各模块的功能,然后fork() ...