123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599 |
- ## 需要使用外层容器包裹并设置宽高
- ## 使用 注意: 需要关掉本地的mock服务, 不然图片转化会报错
- ```
- 组件内使用
- import { VueCropper } from 'vue-cropper'
- components: {
- VueCropper,
- },
- main.js里面使用
- import VueCropper from 'vue-cropper'
- Vue.use(VueCropper)
- cdn方式使用
- <script src="//cdn.jsdelivr.net/npm/vue-cropper@0.4.9/dist/index.js"></script>
- Vue.use(window['vue-cropper'].default)
- nuxt 使用方式
- if(process.browser) {
- vueCropper = require('vue-cropper')
- Vue.use(vueCropper.default)
- }
- ```
- ``` html
- <vueCropper
- ref="cropper"
- :img="option.img"
- :outputSize="option.size"
- :outputType="option.outputType"
- ></vueCropper>
- ```
- ## vue-cropper
- ### 一个优雅的图片裁剪插件
- [预览](http://xyxiao.cn/vue-cropper/example/)
- [english](https://github.com/xyxiao001/vue-cropper/blob/master/english.md)
- ### vue-cropper 相关文章参考。
- #### [shn_ui - vue-cropper ](https://shnhz.github.io/shn-ui/#/component/vue-cropper) 作者 野宁新之助
- #### [vue全家桶开发管理后台—裁切图片](https://blog.csdn.net/qq_30632003/article/details/79639346) 作者: 麻球科技-菅双鹏
- #### [Vue-cropper 图片裁剪的基本原理](https://www.cnblogs.com/tugenhua0707/p/8859291.html) 作者: 龙恩0707
- #### [关于昵称和头像的总结(模仿微信)](https://zhuanlan.zhihu.com/p/45746753) 作者: 秋晨光
- #### [vue-cropper-h5](https://github.com/2277419213/vue-cropper-h5) 作者:居里栈栈
- ### vue-cropper 交流。
- ##### 有什么意见,或者bug 或者想一起开发vue-cropper, 或者想一起开发其他插件
- 
- # vue-cropper
- #### 安装
- ```
- npm install vue-cropper
- yarn add vue-cropper
- ```
- ### 如果你没有使用npm
- [在线例子](https://codepen.io/xyxiao001/pen/wxwKGz)
- ### 服务器渲染 nuxt 解决方案 设置为ssr: false
- ```
- module.exports = {
- ...
- build: {
- vendor: [
- 'vue-cropper
- ...
- plugins: [
- { src: '~/plugins/vue-cropper', ssr: false }
- ]
- }
- }
- ```
- ### 目前还不知道什么原因项目里面开启mock 会导致file报错, 建议使用时 关掉mock
- <table style="text-align: center">
- <thead>
- <tr>
- <td>名称</td>
- <td>功能</td>
- <td>默认值</td>
- <td>可选值</td>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>img</td>
- <td>裁剪图片的地址</td>
- <td>空</td>
- <td>url 地址 || base64 || blob</td>
- </tr>
- <tr>
- <td>outputSize</td>
- <td>裁剪生成图片的质量</td>
- <td>1</td>
- <td>0.1 - 1</td>
- </tr>
- <tr>
- <td>outputType</td>
- <td>裁剪生成图片的格式</td>
- <td>jpg (jpg 需要传入jpeg)</td>
- <td>jpeg || png || webp</td>
- </tr>
- <tr>
- <td>info</td>
- <td>裁剪框的大小信息</td>
- <td>true</td>
- <td>true || false</td>
- </tr>
- <tr>
- <td>canScale</td>
- <td>图片是否允许滚轮缩放</td>
- <td>true</td>
- <td>true || false</td>
- </tr>
- <tr>
- <td>autoCrop</td>
- <td>是否默认生成截图框</td>
- <td>false</td>
- <td>true || false</td>
- </tr>
- <tr>
- <td>autoCropWidth</td>
- <td>默认生成截图框宽度</td>
- <td>容器的80%</td>
- <td>0~max</td>
- </tr>
- <tr>
- <td>autoCropHeight</td>
- <td>默认生成截图框高度</td>
- <td>容器的80%</td>
- <td>0~max</td>
- </tr>
- <tr>
- <td>fixed</td>
- <td>是否开启截图框宽高固定比例</td>
- <td>true</td>
- <td>true | false</td>
- </tr>
- <tr>
- <td>fixedNumber</td>
- <td>截图框的宽高比例</td>
- <td>[1, 1]</td>
- <td>[宽度, 高度]</td>
- </tr>
- <tr>
- <td>full</td>
- <td>是否输出原图比例的截图</td>
- <td>false</td>
- <td>true | false</td>
- </tr>
- <tr>
- <td>fixedBox</td>
- <td>固定截图框大小 不允许改变</td>
- <td>false</td>
- <td>true | false</td>
- </tr>
- <tr>
- <td>canMove</td>
- <td>上传图片是否可以移动</td>
- <td>true</td>
- <td>true | false</td>
- </tr>
- <tr>
- <td>canMoveBox</td>
- <td>截图框能否拖动</td>
- <td>true</td>
- <td>true | false</td>
- </tr>
- <tr>
- <td>original</td>
- <td>上传图片按照原始比例渲染</td>
- <td>false</td>
- <td>true | false</td>
- </tr>
- <tr>
- <td>centerBox</td>
- <td>截图框是否被限制在图片里面</td>
- <td>false</td>
- <td>true | false</td>
- </tr>
- <tr>
- <td>high</td>
- <td>是否按照设备的dpr 输出等比例图片</td>
- <td>true</td>
- <td>true | false</td>
- </tr>
- <tr>
- <td>infoTrue</td>
- <td>true 为展示真实输出图片宽高 false 展示看到的截图框宽高</td>
- <td>false</td>
- <td>true | false</td>
- </tr>
- <tr>
- <td>maxImgSize</td>
- <td>限制图片最大宽度和高度</td>
- <td>2000</td>
- <td>0-max</td>
- </tr>
- <tr>
- <td>enlarge</td>
- <td>图片根据截图框输出比例倍数</td>
- <td>1</td>
- <td>0-max(建议不要太大不然会卡死的呢)</td>
- </tr>
- <tr>
- <td>mode</td>
- <td>图片默认渲染方式</td>
- <td>contain</td>
- <td>contain , cover, 100px, 100% auto</td>
- </tr>
- <!-- <tr>
- <td>limitMinSize</td>
- <td>截图框最小宽高</td>
- <td>10</td>
- <td>number, string, [number, number]</td>
- </tr> -->
- </tbody>
- </table>
- ### 内置方法 通过this.$refs.cropper 调用
- ##### this.$refs.cropper.startCrop() 开始截图
- ##### this.$refs.cropper.stopCrop() 停止截图
- ##### this.$refs.cropper.clearCrop() 清除截图
- ##### this.$refs.cropper.changeScale() 修改图片大小 正数为变大 负数变小
- ##### this.$refs.cropper.getImgAxis() 获取图片基于容器的坐标点
- ##### this.$refs.cropper.getCropAxis() 获取截图框基于容器的坐标点
- ##### this.$refs.cropper.goAutoCrop 自动生成截图框函数
- ##### this.$refs.cropper.rotateRight() 向右边旋转90度
- ##### this.$refs.cropper.rotateLeft() 向左边旋转90度
- #### 图片加载的回调 imgLoad 返回结果success, error
- #### 获取截图信息
- this.$refs.cropper.cropW 截图框宽度
- this.$refs.cropper.cropH 截图框高度
- ``` js
- // 获取截图的base64 数据
- this.$refs.cropper.getCropData((data) => {
- // do something
- console.log(data)
- })
- // 获取截图的blob数据
- this.$refs.cropper.getCropBlob((data) => {
- // do something
- console.log(data)
- })
- ### Description of the default rendering mode of the image
- Image layout mode mode achieves the same effect as css background
- Contain Centered layout Default does not scale Ensure the image is inside the container mode: 'contain'
- Cover stretch layout fill the entire container mode: 'cover'
- If only one value is given, this value will be used as the width value and the height value will be set to auto. mode: '50px'
- If two values are given, the first one will be the width value and the second will be the height value. mode: '50px 60px'
- ### 预览
- ``` html
- @realTime="realTime"
- // Real time preview function
- realTime(data) {
- var previews = data;
- var h = 0.5;
- var w = 0.2;
- this.previewStyle1 = {
- width: previews.w + "px",
- height: previews.h + "px",
- overflow: "hidden",
- margin: "0",
- zoom: h
- };
- this.previewStyle2 = {
- width: previews.w + "px",
- height: previews.h + "px",
- overflow: "hidden",
- margin: "0",
- zoom: w
- };
- 固定为100宽度
- this.previewStyle3 = {
- width: previews.w + "px",
- height: previews.h + "px",
- overflow: "hidden",
- margin: "0",
- zoom: 100 / preview.w
- };
- 固定为100高度
- this.previewStyle4 = {
- width: previews.w + "px",
- height: previews.h + "px",
- overflow: "hidden",
- margin: "0",
- zoom: 100 / preview.h
- };
- this.previews = data;
- },
- <div class="show-preview" :style="{'width': previews.w + 'px', 'height': previews.h + 'px', 'overflow': 'hidden',
- 'margin': '5px'}">
- <div :style="previews.div">
- <img :src="option.img" :style="previews.img">
- </div>
- </div>
- <p>中等大小</p>
- <div :style="previewStyle1">
- <div :style="previews.div">
- <img :src="previews.url" :style="previews.img">
- </div>
- </div>
- <p>迷你大小</p>
- <div :style="previewStyle2">
- <div :style="previews.div">
- <img :src="previews.url" :style="previews.img">
- </div>
- </div>
- =
- ```
- #### 图片移动回调函数 @imgMoving
- ```
- data type
- {
- moving: true, // moving 是否在移动
- axis: {
- x1: 1, // 左上角
- x2: 1,// 右上角
- y1: 1,// 左下角
- y2: 1 // 右下角
- }
- }
- ```
- #### 截图框移动回调函数 @cropMoving
- ```
- data type
- {
- moving: true, // moving 是否在移动
- axis: {
- x1: 1, // 左上角
- x2: 1,// 右上角
- y1: 1,// 左下角
- y2: 1 // 右下角
- }
- }
- ```
- ## 更新日志
- ### 0.55
- ```
- 修复 ios 版本小于 13.4没有处理图片旋转的 bug
- ```
- ### 0.54
- ```
- 去除 log 信息
- 修复 pc safari低版本问题
- ```
- ### 0.53
- ```
- 因为 chrome81 内核版本和 ios13.5 版本修复了图片旋转的 bug
- 插件在新版浏览器默认不处理旋转了,低版本浏览器自动处理
- https://www.chromestatus.com/feature/6313474512650240
- ```
- ### 0.52
- ```
- 撤回最小弹框属性, 存在弹框拖拽坐标判断的 bug
- ```
- ### 0.51
- ```
- 更新裁剪框最小属性, 限制最小区域,可传1以上的数字和字符串,限制长宽都是这么大 也可以传数组[90,90]
- limitMinSize: [Number, Array, String]
- ```
- ### 0.50
- 支持图片清空
- 修复 ie11 ie10 不能使用问题
- 修复 URL.createObjectURL 创建后没有销毁的 bug
- 添加截图框修改触发事件
- this.$emit('change-crop-size', {
- width: this.cropW,
- height: this.cropH
- })
- ### 0.49
- 修复滚轮默认事件问题
- 修复html静态文件引入事件触发问题
- ### 0.48
- 修复mode 属性 contain 和cover的显示bug问题
- 修复ios 下面base64图片跨域显示问题
- ### 0.47
- 修复第一次不触发预览的问题
- 新增加图片渲染mode功能
- ### 0.46
- 修复图片旋转bug
- 修复显示的一些bug
- ### 0.45
- 添加倍数使用 enlarge
- 可以输出裁剪框等比例图片;
- 感谢来自于 [](https://github.com/hzsrc)的贡献
- 添加预览框各种比例, 和修复图片截图小数问题
- ### 0.44
- 修复引入方式的问题
- ```
- 组件内使用
- import { VueCropper } from vue-cropper
- components: {
- VueCropper,
- },
- main.js里面使用
- import VueCropper from vue-cropper
- Vue.use(vueCropper)
- cdn方式使用
- <script src="vuecropper.js"></script>
- Vue.use(window['vue-cropper'])
- ```
- ### v0.43
- 剥离exif的依赖库, 添加exfi-min.js减小代码体积 45.9k => 37k
- build 升级webpack4 升级
- ```
- 添加vue install 方法 =》 npm: Vue.use(VueCropper) web: Vue.use(window['vue-cropper'])
- ```
- ### v0.42
- 修复截图框因为去除小数点的引起的问题
- ### v0.41
- 修复截图框边界问题
- ### v0.40
- 修复orientation的处理方式
- 感谢 [Felipe Mengatto](https://github.com/felipemengatto)的贡献
- ### v0.39
- 修复orientation值不同带来的问题
- 感谢 [Felipe Mengatto](https://github.com/felipemengatto)的贡献
- ### v0.38
- ```
- 修改坐标反馈问题
- ```
- ### v0.37
- ```
- 修复centerBox 的截图超出1px问题
- 添加截图 图片移动触发事件
- ```
- ### v0.36
- ```
- 修复旋转自动生成截图框的错误
- 修改autocrop 可以动态生成截图框
- ```
- ### v0.35
- ```
- 修复其他图片没有压缩的问题
- ```
- ### v0.34
- ```提供移动端崩溃的解决方案
- 修改maxImgSize为2000
- ```
- ### v0.33
- ```提供移动端崩溃的解决方案
- maxImgSize 限制图片最大宽度和高度 默认为2000px
- ```
- ### v0.32
- ```
- 新增截图框信息展示
- infoTrue true 为展示真实输出图片宽高 false 展示看到的截图框宽高
- ```
- ### v0.30
- ```
- 新增获取图片坐标函数 this.$refs.cropper.getImgAxis()
- 新增获取截图框坐标函数 this.$refs.cropper.getCropAxis()
- 新增对高清设备的兼容 high
- 新增截图框限制在图片以内的功能 centerbox
- 新增自动生成截图框函数 this.$refs.cropper.goAutoCrop
- ```
- ### v0.29
- 新增图片加载的回调 imgLoad 返回结果success, error
- ### v0.28
- 修复截图框固定 截图框会影响原图移动 缩放
- ### v0.27
- 鼠标缩放问题优化
- img max-width 样式优化
- 新增属性
- canMove 是否可以移动图片 默认为是
- canMoveBox 是否可以移动截图框 默认为是
- original 是否按图片原始比例渲染 默认为否
- ### v0.26
- 修复火狐浏览器 鼠标缩放问题
- ### v0.25
- 修复图片有可能不展示
- ### v0.24
- 修复ios拍照旋转 截图问题 添加自动修复图片 截图预览代码变更, 修改默认上传图片为blob预览
- ``` html
- realTime (data) {
- this.previews = data
- }
- <div class="show-preview" :style="{'width': previews.w + 'px', 'height': previews.h + 'px', 'overflow': 'hidden',
- 'margin': '5px'}">
- <div :style="previews.div">
- <img :src="previews.url" :style="previews.img">
- </div>
- </div>
- ```
- ### v0.23
- 小优化
- ### v0.22
- 新增修改图片大小函数 通过this.$refs.cropper.changeScale 调用
- ### v0.21
- 新增固定截图框大小fiexdBox(注: 最好搭配自动生成截图框使用)
- ### v0.20
- 新增输出原图比例截图 props名full, 修复缩放图片过大灵敏度问题
- ### v0.19
- 新增图片旋转 修复mac滚轮过度灵敏
- ``` js
- this.$refs.cropper.rotateRight() // 向右边旋转90度
- this.$refs.cropper.rotateLeft() // 向左边旋转90度
- ```
- ### v0.18
- 修复默认生成截图框超过容器错误
- ### v0.17
- 修复blob数据获取错误
- ### v0.15
- 添加手机端手势缩放
- ```
- canScale: true
- ```
- ### v0.13
- 添加预览
- ``` html
- @realTime="realTime"
- // Real time preview function
- realTime (data) {
- this.previews = data
- }
- <div class="show-preview" :style="{'width': previews.w + 'px', 'height': previews.h + 'px', 'overflow': 'hidden',
- 'margin': '5px'}">
- <div :style="previews.div">
- <img :src="option.img" :style="previews.img">
- </div>
- </div>
- ```
|