热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

无需Flash完成图片裁剪——HTML5中级进阶

媒介图片裁剪上传,不仅是一个很贴合用户体验的功用,还能够一致特定图片尺寸,优化网站排版,一举两得。需求就是那末简朴,在浏览器里裁剪图片并上传到服务器。我第一个想到的要领就是,将图片

媒介

图片裁剪上传,不仅是一个很贴合用户体验的功用,还能够一致特定图片尺寸,优化网站排版,一举两得。

需求就是那末简朴,在浏览器里裁剪图片并上传到服务器。

我第一个想到的要领就是,将图片和裁剪参数(x,y,scale,rotate)一并上传给服务器,服务器来做图片处置惩罚,so easy。
然则,这并不相符潮水生长的方向:能在前端做的处置惩罚,就放前端做吧。
与潮水让步的效果就是,前端愈来愈庞杂。

一最先我并不认为浏览器能够读取并天生图片。想想看啊,要做”点击复制”的如许简朴的功用,都须要借助 Flash 的浏览器,权限哪有那末大。

参阅各种网站,只要把图片放在当地处置惩罚的,基本上都借用了Flash。随意抄一个吧,没有API,就算能修正图片,上传途径都不晓得怎么改。更症结的是,我对Flash一无所知。

幸亏我们的网站已完整扬弃了IE9以下的浏览器,只兼容当代HTML5浏览器。(连Opera和微软都最先走Webkit内核的线路了,潮水就是随着Chrome走)只能寄愿望与HTML5,因而研讨了一番,发明以下流程可行。

st=>start: 原图片 File 对象
e=>end: 上传裁剪后的Blob对象
op=>operation: 初始化Cropper 图片Base64预览
op1=>operation: 依据Cropper裁剪参数绘制Canvas(Base64)
op2=>operation: Base64转Blob对象
st->op->op1->op2->e

以下将对每一个环节详解。

猎取原图片 File 对象

每一个图片文件处置惩罚的最先,都是由onchange事宜最先





初始化Cropper

在这里引见一个异常好用的库 cropper.js
https://github.com/fengyuanchen/cropper
天生遮罩、猎取裁剪参数、输出canvas … 而且相对轻量级,紧缩后的css和js代码只要30KB。他是基于JQuery的,引入JQuery能够还要再大点。不过如今哪一个网站没有在用JQuery呢?
兼容IE9+,挪动端体验优越,能够相应触摸缩放,拖动。以下是安卓4.4 原生浏览器中的预览图

《无需Flash完成图片裁剪——HTML5中级进阶》

function handler(event){
...
var URL = window.URL || window.webkitURL , originPhotoURL;
originPhotoURL = URL.createObjectURL(originPhoto); //Base64
$('#preview').cropper({
aspectRatio: 1 / 1, // 牢固裁剪比例1:1,裁剪后的图片为正方形
}).cropper('replace', originPhotoURL); // 动态设置图片预览
}

绘制Canvas

cropper.js 供应了天生Canvas的要领getCroppedCanvas,能够指定天生画布的大小。
或许依据getData猎取裁剪信息(包含扭转和缩放)用ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)举行手动绘制。后者自由性高一点,然则既然有现成的要领,那末就直接用好了。


function cropAndUpload(){
// 此处注重,天生的Canvas长宽比应与之前划定的裁剪比例一致
// 不然天生的图片会有失真
var size = {
width:100,
height:100
}
var croppedCanvas = $('#preview').cropper("getCroppedCanvas",size); // 天生 canvas 对象
var croppedCanvasUrl = croppedCanvas.toDataURL(originFileType); // Base64
...
}

应该注重的是widthheight的值并不引荐设置成牢固值。裁剪框的大小多是会凌驾100100(比方500500)的,而现实天生的图片倒是100100,如许的效果就是直接将一个500500的高清图片,紧缩成了100100的失真图片。一样的,裁剪框小于100100,天生的图片就会隐约。

Base64 转Blob对象

字符串转为二进制?(前端本来是个做页面的,如今也最先操纵文件了。自从有了HTML5,就能够把浏览器看成一个操纵系统了)官方并没有出DataURLtoBlob的要领,所以只能本身写一个,转化也挺简朴:拆解文件范例,将字符数据转成16进制数据存数组,并用数据初始化一个Blob对象。

function dataURLtoBlob(dataurl) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], {type:mime});
}
function cropAndUpload(){
...
var croppedBlob = dataURLtoBlob(croppedCanvasUrl);
croppedBlob.name = originFileName; // Blob对象没有name
// Upload(croppedBlob);
}

如今就能够像处置惩罚FileObject一样处置惩罚 这个blob对象了。

其实在最新的HTML5规范中是支撑HTMLCanvasElement.toBlob(callback, mimeType, quality)

croppedCanvas.toBlob(function(croppedBlob){
// Upload(croppedBlob);
},originFileType)

绕了一个弯,不过照样学到了东西。

原文作者来自 MaxLeap 团队_UX成员:John王
原文链接:https://blog.maxleap.cn/archives/705


推荐阅读
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 网址:https:vue.docschina.orgv2guideforms.html表单input绑定基础用法可以通过使用v-model指令,在 ... [详细]
  • 解决文件名过长下载失败问题的jQuery方案
    本文介绍了使用jQuery解决文件名过长导致下载失败的问题。原方案中存在文件名部分丢失的问题,通过动态生成隐藏域表单并提交的方式来解决。详细的解决方案和代码示例在文章中给出。 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 如何优化Webpack打包后的代码分割
    本文介绍了如何通过优化Webpack的代码分割来减小打包后的文件大小。主要包括拆分业务逻辑代码和引入第三方包的代码、配置Webpack插件、异步代码的处理、代码分割重命名、配置vendors和cacheGroups等方面的内容。通过合理配置和优化,可以有效减小打包后的文件大小,提高应用的加载速度。 ... [详细]
author-avatar
回音爱Fred
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有