不看的会后悔,HTML5自助切图

2024-02-07 06:30

本文主要是介绍不看的会后悔,HTML5自助切图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里使用到的HTML5技术包括:

  1. 本地预览(FileReader)
  2. 拖拽(drag & drop)
  3. 切图(canvas)

拖拽:

拖拽基本事件如下:

DataTransfer 对象退拽对象用来传递的媒介,使用一般为Event.dataTransfer。
draggable 属性就是标签元素要设置draggable=true,否则不会有效果,例如: <div title=”拖拽我” draggable=”true”&rt;列表1</div:rt;</td&rt;
ondragstart 事件当拖拽元素开始被拖拽的时候触发的事件,此事件作用在被拖曳元素上
ondragenter 事件当拖曳元素进入目标元素的时候触发的事件,此事件作用在目标元素上
ondragover 事件拖拽元素在目标元素上移动的时候触发的事件,此事件作用在目标元素上
ondrop 事件被拖拽的元素在目标元素上同时鼠标放开触发的事件,此事件作用在目标元素上
ondragend 事件当拖拽完成后触发的事件,此事件作用在被拖曳元素上
drageleave事件当拖拽离开此处时触发,只在离开这个对象时触发一次,此事件作用在目标元素上
Event.preventDefault() 方法阻止默认的些事件方法等执行。在ondragover中一定要执行preventDefault(),否则ondrop事件不会被触发。另外,如果是从其他应用软件或是文件中拖东西进来,尤其是图片的时候,默认的动作是显示这个图片或是相关信息,并不是真的执行drop。此时需要用用document的ondragover事件把它直接干掉。
Event.effectAllowed 属性就是拖拽的效果。

 

图1是页面上所使用到拖拽的地方。左图为拖拽上传图片,右图为拖拽参考线。

a122

介绍完拖拽基本事件后,再来看下页面是如何通过拖拽将本地图片通过拖拽的方式拖到页面指定区域使用图片上传,这也是拖拽现在比较常用到的功能。

给document增加拖拽事件,当拖拽元素进入页面时改变目标元素样式提示用户目标元素位置,当拖拽元素离开页面后还原样式。代码如下:

document.ondragleave = function(e){e.preventDefault();var el = document.getElementById('target_box');el.className = el.className.replace(/over/g,'');
}
document.ondrop = function(e){e.preventDefault();
}
document.ondragenter = function(e){e.preventDefault();var el = document.getElementById('target_box');el.className = el.className + ' over';
}
document.ondragover = function(e){e.preventDefault();var el = document.getElementById('target_box');el.className = el.className + ' over';
}

当图片被拖到上传区域后通过FileReader方法读取本地文件,然后将图片通过canvas来绘制,如果图片的宽度是大于画布1000px将水平居中处理,这里因为切图的时候需要将图片完整切出来,所以在设置canvas宽度时需要显示成图片的大小,所以这里使用了负marginLeft(这里将图片宽度减1000得出超出1000的区域,然后再除于2得出marginLeft的值)外面套一层1000px的方式来实现水平居中。代码如下:

var box = document.getElementById('target_box');
box.ondrop = function(e){e.preventDefault();//获取文件列表var fileList = e.dataTransfer.files;var reader = new FileReader();reader.onload = function(e){var img = new Image();img.src = this.result;img.onload = function(){if(this.width&gt;1000){canvas.style.marginLeft = ((this.width - 1000)/2) * -1 + 'px';}canvas.width = this.width;canvas.height = this.height;ctx.drawImage(this,0,0);}}reader.readAsDataURL(fileList[0]);document.getElementById('target_box').style.display = 'none';document.getElementById('doc').style.display = 'display';};

本地预览(FileReader)

FileReader接口的方法
readAsBinaryString(file)将文件读取二进制码
通常我们将它传送到后端,后端可以通过这段字符串存储文件
readAsText(file,[encoding])将文件读取文本
第二个参数是文本的编码方式,默认UTF-8
readAsDataURL(file)将文件读取为DataURL
将文件读取为一串Data URL字符串,将小文件以一种特殊格式的URL地址直接读入页面。小文件指图像与html等格式的文件。
FileReader接口的事件
onabort数据读取中断时触发
onerror数据读取出错时触发
onloadstart数据读取开始时触发
onprocess数据读取中
onload数据读取成功完成时触发
onloadend数据读取完成时触发,无论成功失败

这里因为标尺不需要做任何事情处理只需要拖拽效果,所以只需要增加draggable属性就可以,代码如下:
a333
然后给目标元素增加Drop事件,当拖拽的标尺在目标元素上放开时新建一个参考线并通过offsetY来获取鼠标释放时的Y坐标,然后再将这个Y坐标存到数组里。

//增加标尺目标事件
document.getElementById('cvs').ondrop = function(ev){var div = document.createElement('div');div.style.width = '100%'div.style.height = '1px';div.style.background = '#4affff';div.style.position = 'absolute'div.style.top = ev.offsetY + 18 + 'px';document.getElementById('screen').appendChild(div);rulerTop.push(ev.offsetY);return false;
}

Canvas:

这里先介绍下canvas的drawImage方法,切图的核心方法就是这个,我们先来看看官方给出的使用方法与解释:
drawImage(image, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight)
image所要绘制的图像。这必须是表示  标记或者屏幕外图像的 Image 对象,或者是 Canvas 元素。
sourceX, sourceY图像将要被绘制的区域的左上角。这些整数参数用图像像素来度量。
sourceWidth, sourceHeight图像所要绘制区域的大小,用图像像素表示。
destX, destY所要绘制的图像区域的左上角的画布坐标。
destWidth, destHeight图像区域所要绘制的画布大小。

了解了drawImage方法后我们来看下,如何通过drawImage达到切图效果,其实这里的切图,只是通过drawImage加上高宽和偏移量来实现所谓的切图效果,代码如下:

//绘制图片
function scaleCanvas (canvas, width, height, destX, destY) {var w = canvas.width,h = canvas.height;var cutCanvas = document.createElement('canvas');var cutCtx = cutCanvas.getContext('2d');cutCanvas.width = width;cutCanvas.height = height;cutCtx.drawImage(canvas, 0, 0, w, h, destX, destY, w, h);return cutCanvas;
}
//获取图片URL
function getDataURL (canvas, width, height, destX, destY) {canvas = scaleCanvas(canvas, width, height, destX, destY);return canvas.toDataURL('image/jpeg');
}
//将conver转成IMG格式
var convertToImage = function (canvas, width, height, destX, destY) {var strData = getDataURL(canvas, width, height, destX, destY);return encodeURIComponent(strData);
}

这里先说下大致实现的原理,首先先创建一个新的canvas然后设置好宽高,而这个宽高就是参考线分隔的每一块宽高,然后过通drawImage将原图上某块局域复制一份出来,再通过toDataURL转成base64编码方便本地显示。
所在在这个Demo中image就是我们刚上传的那个图片,sourceX、sourceY和destWidth、destHeight取图片的原始高宽,而我们要复制的局域也是从新的canvas上的左上角开始,所以这里的sourceX、sourceY为0,0。这里最主要的就是destX、destY,就是他们来控制复制局域的起始坐标,因为新图片是需要从最左边开始复制,所以destX为0,而destY将根据参考线的纵坐标来定值。

这里要注意一下,因为域的问题,所以如果页面不是放到服务器上运行而是本地运行的话会出现权限报错情况

最后附上Demo一枚,欢迎大家尽情的暴、使劲暴。(Demo只支持chrome浏览器,其他浏览器会有不良反应,请见谅)

好了,整个HTML5自助化切图的主要代码就这些,这里第一次尝试用HTML5去做一些实实在在的东西,可能代码并不是最优,还能继续优化,大家如果对于文章有什么建议或不明白的地方欢迎讨论。

在旧版的切图工具里,我们的做法是将图片上传到服务器,然后通过服务器端把图片切好后把对应的地址返回,前端再把页面显示出来。这样的做法会导致在网络慢时出现长时间的等待,而如果页面放弃这里的操作,还需要将图片从服务器端删除掉。在拖拽参考线时也只能通过大量的代码去实现,还需要编写一些服务器端代码。

HTML5版相对有响应速度快(本地读取)、拖拽功能简单、前端切图不需要依赖服务器,减少开发成本。

反正HTML5是个上流、好玩、有趣、简单的好东西,值得你一生拥有。

这篇关于不看的会后悔,HTML5自助切图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/686797

相关文章

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

React实现原生APP切换效果

《React实现原生APP切换效果》最近需要使用Hybrid的方式开发一个APP,交互和原生APP相似并且需要IM通信,本文给大家介绍了使用React实现原生APP切换效果,文中通过代码示例讲解的非常... 目录背景需求概览技术栈实现步骤根据 react-router-dom 文档配置好路由添加过渡动画使用

使用Vue.js报错:ReferenceError: “Vue is not defined“ 的原因与解决方案

《使用Vue.js报错:ReferenceError:“Vueisnotdefined“的原因与解决方案》在前端开发中,ReferenceError:Vueisnotdefined是一个常见... 目录一、错误描述二、错误成因分析三、解决方案1. 检查 vue.js 的引入方式2. 验证 npm 安装3.

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

python解析HTML并提取span标签中的文本

《python解析HTML并提取span标签中的文本》在网页开发和数据抓取过程中,我们经常需要从HTML页面中提取信息,尤其是span元素中的文本,span标签是一个行内元素,通常用于包装一小段文本或... 目录一、安装相关依赖二、html 页面结构三、使用 BeautifulSoup javascript

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06