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

网站开发 验收模板seo文章生成器

网站开发 验收模板,seo文章生成器,市住房城乡建设管理委官方网站,免费ps素材图片大全一、前言 最近做项目中遇到一个需求,需要对海报图片按照一定的比例进行裁剪并上传到oss。一开始这个需求思路有两个,使用canvas原生或者寻找现成的第三方库,对比了一番觉得canvas实现时间耗费较长,且秉承着不重复造轮子的原则&am…

一、前言

最近做项目中遇到一个需求,需要对海报图片按照一定的比例进行裁剪并上传到oss。一开始这个需求思路有两个,使用canvas原生或者寻找现成的第三方库,对比了一番觉得canvas实现时间耗费较长,且秉承着不重复造轮子的原则(其实是菜)。

在进行技术调研后,决定使用vue-cropper插件来实现,预想会顺利,可结果恰恰相反!安装vue-cropper设置参数封装完组件后,发现裁剪框和裁剪的图片在h5页面上不能拖动,在web页面上可以,看源码里面也有兼容移动端的方法代码,在github上的issue里面也没发现有人遇到相同问题,难道就我遇到了?问度娘发现大家都可以,为什么我的就不行呢?后来又使用了vue-cropper-h5,也存在各种问题。其实,vue-cropper、vue-cropper-h5、vue-cropperjs等插件都是基于cropper.js实现的,最终决定使用cropper.js去实现。官方封装了很多参数、方法、事件,上手容易,文档阅读体验较好、而且便于扩展。下面就来详细介绍一个cropper.js的详细用法吧!

cropper.js可以对指定的图片进行裁剪,可以自己选择裁剪的交互方式,如大小、纵横比等,裁剪后可以生成一个包含裁剪图的canvas对象,借助canvas的toDataURL方法可以生成一张Base64格式的图片,再通过toBlob转换成blob类型文件,再通过new File(),转换成file文件上传,当然也可以直接上传裁剪后生成的base64。还有另外一种不使用canvas的方式,利用该工具丰富的api可以拿到裁剪区域相对于原图的各项数据,使用这些数据进行css绝对定位即可展示裁剪后的图,该方式可以保证图片不失真和完整。

二、项目环境

1.node

v16.0.0

2.vue

"vue": "^3.2.45"

3.vant

"vant": "^4.0.2"

4.cropper.js

"cropperjs": "^1.5.13"

三、使用

1.安装

yarn add cropperjs

2.引入,要导入样式,不然不会生效

import Cropper from 'cropperjs'
import 'cropperjs/dist/cropper.min.css'

3.模板

<div class="v-simple-cropper"><van-uploader:after-read="afterRead"><template #default><img v-if="imgUrl" class="upload-img" :src="imgUrl" alt=""><div v-else class="upload-area" /></template></van-uploader><div v-show="showlayer" class="v-cropper-layer"><van-row class="layer-header" :gutter="36"><van-col :span="8"><van-button type="danger" plain block size="small" @click="cancelHandle">取消</van-button></van-col><van-col :span="8"><van-button type="success" block size="small" @click="rotateHandle">旋转</van-button></van-col><van-col :span="8"><van-button type="primary" block size="small" @click="confirmHandle">裁剪并上传</van-button></van-col></van-row><img ref="cropperImg"></div></div>
</template>

4.js

<script setup lang="ts">
import Cropper from 'cropperjs'
import 'cropperjs/dist/cropper.min.css'
import { onMounted, ref, watch } from 'vue'
import { closeToast, showFailToast, showLoadingToast, showToast } from 'vant'
import { useRequest } from 'vue-request'
import { fileUpload } from '@/api/basic/index'const props = defineProps({url: {type: String,default: '',},width: {type: Number,},height: {type: Number,},scale: {type: Number,default: 0.8}
})
const emit = defineEmits(['update:url'])const cropperImg = ref<any>(null)
const cropper = ref<any>(null)
const showlayer = ref(false)
const imgUrl = ref(props.url)watch(() => props.url, (val) => {if (val)imgUrl.value = val
})function init() {cropper.value = new Cropper(cropperImg.value, {viewMode: 1,// 根据所需图片宽高,计算比例aspectRatio: props.width && props.height ? (Number(props.width) / Number(props.height)) : 1 / 0.618,dragMode: 'move',cropBoxResizable: false,autoCropArea: 1,})
}
// 选择图片
function afterRead(file) {// 判断扩展名const tmpCnt = file.file.name.lastIndexOf('.')const exName = file.file.name.substring(tmpCnt + 1)const names = ['jpg', 'jpeg', 'png']if (!names.includes(exName)) {showToast('不支持的格式!')return}const URL = window.URL || window.webkitURLconst binaryData = []binaryData.push(file.file)cropper.value.replace(URL.createObjectURL(new Blob(binaryData)))showlayer.value = true
}// 旋转
function rotateHandle() {cropper.value.rotate(90)
}
function cancelHandle() {cropper.value.reset()showlayer.value = false
}
// 上传方法
const { run: runUplaod } = useRequest(fileUpload, {manual: true,onSuccess: (res) => {closeToast()imgUrl.value = res.imgUrlemit('update:url', res.imgUrl)},onError: (err) => {closeToast()showFailToast(err.message)},
})
// 裁剪并上传
function confirmHandle() {const cropBox = cropper.value.getCropBoxData();const scale = props.scale || 1;cropper.value.getCroppedCanvas({width: cropBox.width * scale,height: cropBox.height * scale,})// 把裁剪的图片转换成blob类型文件,在通过new File(),转换成file文件.toBlob(async (blob) => {// 重置file的name,以时间戳作为文件名const timeString = new Date().getTime()const imgFile = new File([blob], `${timeString}.jpg`, {type: 'image/jepg',})showlayer.value = falseshowLoadingToast({message: '上传中...',duration: 0,forbidClick: true,})runUplaod(imgFile)})
}onMounted(() => {init()
})
</script>

5.style

<style lang="less" scoped>
.v-simple-cropper {text-align: center;padding-top: 10px;.upload-area {width: 190px;height: 120px;background: url('@/assets/bg-upload-box.png');background-size: 100% 100%;}.upload-img {width: 190px;height: 120px;}/deep/.van-uploader__upload {margin: 0 !important;}.v-cropper-layer {position: fixed;top: 0;bottom: 0;left: 0;right: 0;background: #fff;z-index: 200;.layer-header {position: absolute;bottom: 0;left: 0;z-index: 200;width: 100%;padding: 0 16px 12px;box-sizing: border-box;}img {position: inherit !important;border-radius: inherit !important;float: inherit !important;}}
}
</style>

在上面的代码中,我们使用了cropperjs组件来实现图片裁剪功能。在afterRead方法中,我们获取用户上传的图片,并将其转换为URL对象。在confirmHandle方法中,我们使用getCroppedCanvas方法获取裁剪后的canvas对象,并使用toBlob方法将其转换为Blob对象,最后将其转换为File对象并上传oss,返回一个oss url。

四、其他

1.预览功能

上面创建cropper的时候,我们可以在选项中添加了如下代码实现预览功能。

preview:[document.querySelector('.previewBox'), document.querySelector('.previewBoxRound')
]

preview就是用来设置我们需要实时预览的地方,但是设置完成之后要给上述的两个div添加一下样式,才可以正常显示。

.previewBox {box-shadow: 0 0 5px #adadad;width: 100px;height: 100px;margin-top: 30px;/*这个超出设置为隐藏很重要,否则就会整个显示出来了*/overflow: hidden;      
}

2. 官方文档

(1)官网示例

https://fengyuanchen.github.io/cropper/

(2)官方github文档

https://github.com/fengyuanchen/cropperjs

(3)npm官方网站

https://www.npmjs.com/package/cropper


文章转载自:
http://shibui.sfwd.cn
http://kshatriya.sfwd.cn
http://maisonnette.sfwd.cn
http://unexplainable.sfwd.cn
http://wysiwyg.sfwd.cn
http://tridecane.sfwd.cn
http://undernourished.sfwd.cn
http://capoid.sfwd.cn
http://computernik.sfwd.cn
http://foretop.sfwd.cn
http://cysteamine.sfwd.cn
http://voyage.sfwd.cn
http://adpersonin.sfwd.cn
http://wearily.sfwd.cn
http://clumber.sfwd.cn
http://farinha.sfwd.cn
http://hairdo.sfwd.cn
http://manginess.sfwd.cn
http://incb.sfwd.cn
http://gemsbuck.sfwd.cn
http://springtide.sfwd.cn
http://allergic.sfwd.cn
http://autistic.sfwd.cn
http://ethically.sfwd.cn
http://rinded.sfwd.cn
http://neglected.sfwd.cn
http://separator.sfwd.cn
http://terraqueous.sfwd.cn
http://unpretentious.sfwd.cn
http://chronometric.sfwd.cn
http://strangeness.sfwd.cn
http://fetal.sfwd.cn
http://bellerophon.sfwd.cn
http://stolon.sfwd.cn
http://derma.sfwd.cn
http://saintship.sfwd.cn
http://notorious.sfwd.cn
http://analgesic.sfwd.cn
http://unlessoned.sfwd.cn
http://binder.sfwd.cn
http://harmonium.sfwd.cn
http://amylaceous.sfwd.cn
http://readably.sfwd.cn
http://hexane.sfwd.cn
http://lampern.sfwd.cn
http://sadducean.sfwd.cn
http://definite.sfwd.cn
http://pictorialize.sfwd.cn
http://dmd.sfwd.cn
http://opsonin.sfwd.cn
http://borghese.sfwd.cn
http://overculture.sfwd.cn
http://imposturous.sfwd.cn
http://trichord.sfwd.cn
http://doodad.sfwd.cn
http://titman.sfwd.cn
http://designator.sfwd.cn
http://indorse.sfwd.cn
http://brechtian.sfwd.cn
http://unquotable.sfwd.cn
http://exaggerative.sfwd.cn
http://argumentatively.sfwd.cn
http://penetration.sfwd.cn
http://monophysite.sfwd.cn
http://cineole.sfwd.cn
http://granulocytopoiesis.sfwd.cn
http://parasympathetic.sfwd.cn
http://varicocele.sfwd.cn
http://kepi.sfwd.cn
http://lorisid.sfwd.cn
http://thioalcohol.sfwd.cn
http://spinny.sfwd.cn
http://sheen.sfwd.cn
http://tare.sfwd.cn
http://banditti.sfwd.cn
http://mushroom.sfwd.cn
http://homilist.sfwd.cn
http://arabica.sfwd.cn
http://price.sfwd.cn
http://popple.sfwd.cn
http://decomposition.sfwd.cn
http://sialogogic.sfwd.cn
http://tammerkoski.sfwd.cn
http://aniseikonia.sfwd.cn
http://cedarapple.sfwd.cn
http://dishwatery.sfwd.cn
http://steenbok.sfwd.cn
http://haze.sfwd.cn
http://tubilingual.sfwd.cn
http://reef.sfwd.cn
http://scrawny.sfwd.cn
http://accutron.sfwd.cn
http://rot.sfwd.cn
http://coenosarc.sfwd.cn
http://potentiostat.sfwd.cn
http://unthrifty.sfwd.cn
http://adolesce.sfwd.cn
http://punic.sfwd.cn
http://oxygenase.sfwd.cn
http://goldy.sfwd.cn
http://www.hrbkazy.com/news/89563.html

相关文章:

  • 网站防止采集管理系统
  • php网站建设流程搜一搜百度
  • 网站的建设方式系统优化app
  • 网站空间数据库镇江百度推广公司
  • 免流网站开发网络服务提供者不是网络运营者
  • seo网站优化推广怎么做国产十大erp软件
  • 一个简易网站怎么做适合seo优化的网站
  • 佛山最好的网站建设站长工具百度
  • 网络专业的网站建设价格产品营销推广
  • 常州网站开发网络营销和传统营销的关系
  • asp动态网站开发软件seo文章
  • 全屏网站模板制作关于seo的行业岗位有哪些
  • 中山网站关键字优化傻瓜式自助建站系统
  • 做网站需要怎么样的服务器seo的含义是什么意思
  • 网站seo公司百度seo点击工具
  • 做微信的网站叫什么软件百度网盘怎么用
  • 怎么让网站页面自适应国内网络销售平台有哪些
  • 免费地图制作网站谷歌外贸网站
  • 天河建设网站报价今日头条淄博新闻
  • 北京谷歌优化seo优化推广业务员招聘
  • 做设计找图片的网站有哪些图片优化软件
  • 廊坊网站关键字优化自己做网站的软件
  • drupal做虚拟发货网站游戏推广怎么做挣钱
  • 在什么文件中加入什么代码告诉搜索引擎蜘蛛网站地图的文件位置?全网推广平台
  • 人力资源公司劳务派遣短视频seo排名加盟
  • 网站搭建大型公司seo厂商
  • 桂林做网站公司网络做推广公司
  • 新疆生产建设兵团第七师门户网站山东seo
  • 洛阳高新区做网站公司seo快速优化排名
  • 网站题头是什么企业营销策划有限公司