当前位置: 首页 > news >正文

安阳专业做网站公司提高网站粘性

安阳专业做网站公司,提高网站粘性,网站设计与制作专业,wordpress免费的吗头像剪切上传 文章说明核心Api示例源码效果展示源码下载 文章说明 本文主要为了学习头像裁剪功能#xff0c;以及熟悉canvas绘图和转文件的相关操作#xff0c;参考教程#xff08;Web渡一前端–图片裁剪上传原理#xff09; 核心Api 主要就一个在canvas绘图的操作 context… 头像剪切上传 文章说明核心Api示例源码效果展示源码下载 文章说明 本文主要为了学习头像裁剪功能以及熟悉canvas绘图和转文件的相关操作参考教程Web渡一前端–图片裁剪上传原理 核心Api 主要就一个在canvas绘图的操作 context.drawImage(image, imgX, imgY, rectangleWidth, rectangleHeight, 0, 0, canvas.width, canvas.height); 以及canvas转为file对象的操作 let formData new FormData(); const file new File([blob], data.selectFileName, {type: data.selectFileType}) formData.append(“file”, file); 关于其中的绘制区域的大小缩放以及移动也算是一个小难点一般也有另一种裁剪区域风格即四条线风格可通过代码进行理解 示例源码 AvatarUpload.vue templatediv classcontainerdiv classimg-containerdiv classselect-file clickselectFile v-if!data.selectFilepjpg/png file with a size less than 5MBemclick to upload/em/p/divimg alt :srcdata.src classimg v-ifdata.selectFile draggablefalse:style{height : data.imgHeight }/div classrectangle v-ifdata.selectFile mousedowndragStart($event) mousemovechangePos($event)mousewheelwheel($event)/div/divcanvas width100 height100 classcanvas/canvasel-button typeprimary classupload-button clickuploadAvatar上传/el-button/div /templatescript import {onBeforeUnmount, onMounted, reactive} from vue; import {axiosRequest, message} from /util/api; import {MethodType} from /util/constant;export default {setup: function () {const data reactive({src: null,imgHeight: 300px,selectFile: false,selectFileName: ,selectFileType: ,});async function selectFile() {const pickerOpts {types: [{description: Images,accept: {image/*: [.png, .jpeg, .jpg],},},],excludeAcceptAllOption: true,multiple: false,};try {const fileHandle await window.showOpenFilePicker(pickerOpts);const file await fileHandle[0].getFile();data.selectFileName file.name;data.selectFileType file.type;const reader new FileReader();reader.readAsDataURL(file);reader.onload function (e) {data.src e.target.result;data.selectFile true;image new Image();image.src e.target.result;setTimeout(() {data.imgHeight image.height px;rectangle imgContainer.getElementsByClassName(rectangle)[0];rectangleWidth rectangle.clientWidth;rectangleHeight rectangle.clientHeight;context.drawImage(image, (image.width / 2 - rectangleWidth / 2), (image.height / 2 - rectangleHeight / 2), rectangleWidth, rectangleHeight, 0, 0, canvas.width, canvas.height);}, 0);};} catch (e) {if (!(e.name AbortError e.message The user aborted a request.)) {throw e;}}}let isDragging false;let mouseUpListener;let containerX;let containerY;let imgContainer;let imgWidth;let imgHeight;let rectangle;let initialX;let initialY;let rectangleWidth;let rectangleHeight;let imgX;let imgY;let headerHeight;let canvas;let context;let image;function dragStart(e) {isDragging true;containerX imgContainer.offsetLeft;containerY imgContainer.offsetTop;imgWidth imgContainer.clientWidth;imgHeight imgContainer.clientHeight;initialX e.offsetX;initialY e.offsetY;rectangle imgContainer.getElementsByClassName(rectangle)[0];rectangleWidth rectangle.clientWidth;rectangleHeight rectangle.clientHeight;}function changePos(e) {if (!isDragging) {return;}const x e.clientX - containerX - initialX rectangleWidth / 2;const y e.clientY - containerY - initialY - headerHeight rectangleHeight / 2;if (x rectangleWidth / 2 3 x imgWidth - rectangleWidth / 2 - 2) {imgX x - rectangleWidth / 2;rectangle.style.left x px;centerX imgX rectangleWidth / 2;context.drawImage(image, imgX, imgY, rectangleWidth, rectangleHeight, 0, 0, canvas.width, canvas.height);}if (y rectangleHeight / 2 3 y imgHeight - rectangleHeight / 2 - 4) {imgY y - rectangleHeight / 2;rectangle.style.top y px;centerY imgY rectangleHeight / 2;context.drawImage(image, imgX, imgY, rectangleWidth, rectangleHeight, 0, 0, canvas.width, canvas.height);}}onMounted(() {mouseUpListener () {isDragging false;}document.addEventListener(mouseup, mouseUpListener);const containerList document.getElementsByClassName(container);const container containerList[containerList.length - 1];headerHeight container.parentNode[getBoundingClientRect]().y;imgContainer container.getElementsByClassName(img-container)[0];canvas container.getElementsByClassName(canvas)[0];context canvas.getContext(2d);});onBeforeUnmount(() {document.removeEventListener(mouseup, mouseUpListener);});const gap 2;const minRange 20;let centerX;let centerY;function wheel(e) {if (!centerX) {centerX image.width / 2;}if (!centerY) {centerY image.height / 2;}if (e.deltaY 0) {if (rectangleWidth gap image.width || rectangleHeight gap image.height) {return;}if ((centerX - rectangleWidth / 2 - gap 0) || (centerY - rectangleHeight / 2 - gap 0)) {return;}rectangleWidth gap;rectangleHeight gap;rectangle.style.width rectangleWidth px;rectangle.style.height rectangleHeight px;} else {if (rectangleWidth - gap minRange || rectangleHeight - gap minRange) {return;}rectangleWidth - gap;rectangleHeight - gap;rectangle.style.width rectangleWidth px;rectangle.style.height rectangleHeight px;}context.drawImage(image, (centerX - rectangleWidth / 2), (centerY - rectangleHeight / 2), rectangleWidth, rectangleHeight, 0, 0, canvas.width, canvas.height);}function uploadAvatar() {if (!data.selectFile) {message(请先选择图片, info);return;}canvas.toBlob((blob) {let formData new FormData();const file new File([blob], data.selectFileName, {type: data.selectFileType})formData.append(file, file);axiosRequest(MethodType.post, /user/uploadAvatar, formData, (res) {message(res.data.msg, info);});}, data.selectFileType);}return {data,selectFile,dragStart,changePos,wheel,uploadAvatar,}} } /scriptstyle scoped .container {margin: 0 auto;padding-top: 100px;width: fit-content;user-select: none;display: flex;justify-content: center;align-items: center; }.img-container {position: relative;width: fit-content; }.rectangle {width: 100px;height: 100px;border: 1px dashed #409eff;position: absolute;left: 50%;top: 50%;transform: translateX(-50%) translateY(-50%);z-index: 999;box-shadow: #888888 0 0 1px 1px;cursor: pointer; }.select-file {width: 500px;height: 300px;border: 1px dashed #dcdfe6;border-radius: 20px;display: flex;justify-content: center;align-items: center; }.select-file:hover {border: 1px dashed #409eff;cursor: pointer; }.select-file p {font-size: 14px;color: #606266; }.select-file p em {color: #409eff;font-style: normal;margin-left: 5px; }.img {border-radius: 20px;border: 1px dashed #409eff; }.canvas {margin-left: 100px;border: 1px dashed #409eff;float: left;border-radius: 50%; }.upload-button {position: absolute;width: 180px;height: 50px;top: 460px;font-size: 20px; } /style效果展示 关于裁剪区域的风格设置为四条线可移动那种需要改动一些代码考虑后续补充 源码下载 参见Gitee链接WEB-OS-SYSTEM
http://www.hkea.cn/news/14335483/

相关文章:

  • 创建站点的步骤平度推广网站建设
  • 旅游网站开发的背景及意义西安快速建站网络公司
  • 上海高中生做课题的网站做宽屏网站
  • 专业做网站套餐找人做网站内容自己编辑吗
  • 湛江模板建站公司响应式网站特点
  • 深圳网站建设599元全包软件开发培训多少钱
  • 邯郸建设公司网站建筑人才网官网登录
  • 平面设计专业网站网站开发必须要做前端吗
  • 景德镇网站制作公司番禺品牌型网站建设
  • 凡科网站可以做淘宝客吗企业融资方式有哪几种
  • 做网站要用什么服务器吗建筑公司网站md0095设计风格
  • 南阳手机网站制作百度上面做企业网站怎么做
  • 临沂网站建设费用wordpress表单支付
  • 江苏天矗建设集团网站wordpress icp涵数
  • 酒泉网站建设有限公司做时尚网站取个名字
  • 营销网络的建设是什么意思优化百度网站
  • 有趣的网站大全为什么网站开发这么便宜
  • 做网站买什么空间用什么软件来做网站
  • 博客平台 wordpress重庆seo排名软件
  • 网站站内的seo怎么做网站域名被做网站的公司擅自更改
  • php网站开发深圳燃气公司是国企吗
  • 为什么不能自己做网站玩游戏的网页
  • 成都市锦江区网站建设阿里云 网站备案
  • 单页网站模板修改网站建设 尚品中国
  • 北京附近做网站的公司wordpress用户名是哪个文件
  • 微商网站推广WordPress模仿教程
  • 如何网站建设 需要详细的步骤网站按钮代码
  • 个人网站设计怎么做第三方网站做app
  • 建立品牌网站的想做软件开发需要学什么
  • 怎么做公司内部网站代理公司注册上海