百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

这款图片剪裁开源项目,简直逆天了

liebian365 2025-01-13 15:21 17 浏览 0 评论

今天看到一款前端图片剪裁开源项目- vue-picture-cut,基于vue开发,功能太逆天,特来分来,建议收藏;


先来个预览看看:



功能在线演示站点:

https://htmlpreview.github.io/?https://raw.githubusercontent.com/987153776/vue-picture-cut/master/dist/index.html


这是一款基于vue和typescript开发的一款图片剪裁处理工具。优点:原生、轻量、使用简单、功能全面、扩展性强。目前功能:缩放、翻折、旋转、边缘校验、矩形剪裁、任意(椭)圆剪裁。


码云开源地址:

https://gitee.com/light-year/vue-picture-cut


github开源地址:

https://github.com/987153776/vue-picture-cut





vue-picture-cut 2.x

English | 中文

基于vue和typescript开发的一款图片剪裁处理工具
优点:原生、轻量、使用简单、功能全面、扩展性强
目前功能:缩放、翻折、旋转、边缘校验、矩形剪裁、任意(椭)圆剪裁
关于缩放:鼠标(鼠标滚轮缩放)、触屏(双指缩放)

github主页
码云主页
demo演示(github)
demo演示(码云)

0.x版本点这里【此版本bug太多,不再维护】

一、使用方法

通过npm安装插件

在vue中使用

1、在main.js中全局引用

import Vue from 'vue';
import 'vue-picture-cut/lib/vue-picture-cut.css';
import VuePictureCut from 'vue-picture-cut';

Vue.use(VuePictureCut);

2、或者在.vue文件中单独引用

<template>
  <div>
	<input type="file" accept="image/*" @change="inputChange"/>
    <vue-picture-cut :src="src" @on-change="cutChange"/>
  </div>
</template>

<script>
  import { VuePictureCut } from 'vue-picture-cut';

  export default {
    // ...
    components: {
      VuePictureCut
    },
    data () {
      return {
        src: null,
        blob: null,
        base64: null
      }
    },
    methods: {
      inputChange(e) {
        const file = e.target.files[0];
        this.src = URL.createObjectURL(file);
      },
      /**
       * @param blob      BLOB对象
       * @param base64    base64字符串
       */
      cutChange({ blob, base64 }) {
        this.blob = blob;
        this.base64 = base64;
      }
    }
    // ...
  }
</script>

<style>
  @import "~vue-picture-cut/lib/vue-picture-cut.css";
</style>

3、注意

组件在使用时,宽高跟随父级标签,所以需要设置父级标签的宽高。

二、API

暴露的对象

全局引入时

import VuePictureCut from 'vue-picture-cut';
Vue.use(VuePictureCut);

此时会注册:VuePictureCut、VuePictureCutMask、VuePictureCutMenu三个组件。

独立引用

import {
  VuePictureCut,
  VuePictureCutMask,
  VuePictureCutMenu,
  Bezier,
  createAnimation,
  Tool,
  createUtils
} from 'vue-picture-cut';

组件:VuePictureCut、VuePictureCutMask、VuePictureCutMenu。工具类:Bezier、createAnimation、Tool、createUtils。

1、VuePictureCut组件

slot插槽: default、menu

使用:

/demo/demo1.html
/demo/demo2.html

<template>
  <vue-picture-cut
    ref="pictureCut"
    :src="src"
    :magnification="magnification"
    :init-angle="initAngle"
    :msk-option="mskOption"
    :max-pixel="maxPixel"
    :encoder-options="encoderOptions"
    :format="format"
    :rotate-control="rotateControl"
    :menu-position="menuPosition"
    :menu-thickness="menuThickness"
    :background-color="backgroundColor"
    @on-change="onChange"
  />
</template>

属性:

  1. src:
    类型:string
    默认:null
    描述:图片链接
  2. magnification:
    类型:number
    默认:1.5
    描述:画布绘制缩放率,取值大于0,取值越大绘制的逻辑像素越高
  3. initAngle:
    类型:number
    必须:非必须
    描述:载入图片的初始旋转角度
  4. maxPixel:
    类型:number
    必须:非必须
    描述:导出图片的宽高中较长边的像素,不传时则依据实际图片大小自适应。
  5. encoderOptions:
    类型:number
    必须:非必须
    描述:导出图片的压缩率,不传时按0.8计算,取值范围0~1。
  6. format:
    类型:string
    默认:false
    描述:导出图片的格式,不传时导出格式为“image/jpeg”,其值可以为“image/png”等浏览器支持格式。
  7. mskOption:
    类型:object
    默认:{ width: 1, height: 1, isRound: false, resize: true}
    描述:
    width:number 裁剪框比例宽
    height:number 裁剪框比例高
    isRound:boolean 矩形true,椭圆false
    resize:boolean 裁剪框大小是否可通过拖动改变大小
    color:string 遮罩颜色
    borderColor:string 裁剪框颜色
  8. rotateControl:
    类型:boolean
    默认:false
    描述:是否显示旋转控件。
  9. menuPosition:
    类型:string
    默认:bottom
    描述:菜单栏位置,取值:top、bottom、left、right。
  10. menuThickness:
    类型:number
    必须:非必须
    描述:menuPosition取top、bottom时表示菜单栏高度,menuPosition取left、right时表示菜单栏高度宽度,取值大于0,等于0时隐藏菜单栏。
  11. backgroundColor:
    类型:string
    必须:非必须
    描述:组件背景色。

事件:

  1. onChange ({ blob, base64 }):监听图片最终裁剪导出的事件
    blob:导出图片的Blob对象,可用于图片上传
    base64:导出图片的base64字符串,可用于图片上传

方法:

  1. this.$refs['pictureCut'].scale(zoom):缩放图片
    参数zoom:缩放后的尺寸和当前尺寸的比例,取值大于0,0到1之间缩小,大于1放大。

2、VuePictureCutMask组件

VuePictureCutMask是VuePictureCut默认slot插槽组件,是控制遮罩裁剪框相关的组件,使用它与不使用它效果一样。

使用:

/demo/demo3.html

<template>
  <vue-picture-cut
    :src="src"
    :magnification="magnification"
    :init-angle="initAngle"
    :rotate-control="rotateControl"
    :max-pixel="maxPixel"
    :encoder-options="encoderOptions"
    :format="format"
    :background-color="backgroundColor"
    @on-change="onChange"
  >
    <vue-picture-mask
      :width="width"
      :height="height"
      :is-round="isRound"
      :resize="resize"
      :color="color"
      :border-color="borderColor"
    />
  </vue-picture-cut>
</template>

属性:

  1. width:
    类型:number
    默认:1
    描述:裁剪框比例宽
  2. height:
    类型:number
    默认:1
    描述:裁剪框比例高
  3. isRound:
    类型:boolean
    默认:false
    描述:矩形true,椭圆false
  4. resize:
    类型:boolean
    默认:false
    描述:裁剪框大小是否可通过拖动改变大小
  5. color:
    类型:string
    必须:非必须
    描述:遮罩颜色
  6. borderColor:
    类型:string
    必须:非必须
    描述:裁剪框颜色

3、VuePictureCutMenu组件

菜单栏组件,效果参见Demo。

使用:

/demo/demo4.html
/demo/demo5.html

<template>
  <vue-picture-cut
    :src="src"
    :magnification="magnification"
    :init-angle="initAngle"
    :rotate-control="rotateControl"
    :msk-option="mskOption"
    @on-change="cutChange"
  >
    <vue-picture-menu
      slot="menu"
      :cancel="false"
      :max-pixel="maxPixel"
      :encoder-options="encoderOptions"
      :format="format"
      :theme="theme"
      confirm-name="Ok"
      cancel-name="Cancel"
      size-auto-name="auto"
      size-raw-name="raw"
      menu-rotate-name="Rotate"
      @on-change="onChange"
      @on-cancel="onCancel"
    />
  </vue-picture-cut>
</template>

属性:

  1. cancel:
    类型:boolean
    默认:false
    描述:是否显示取消按钮。
  2. maxPixel:
    类型:number
    必须:非必须
    描述:导出图片的宽高中较长边的像素,不传时则依据实际图片大小自适应。
  3. encoderOptions:
    类型:number
    必须:非必须
    描述:导出图片的压缩率,不传时按0.8计算,取值范围0~1。
  4. format:
    类型:string
    默认:false
    描述:导出图片的格式,不传时导出格式为“image/jpeg”,其值可以为“image/png”等浏览器支持格式。
  5. theme:
    类型:string
    默认:'default'
    描述:菜单栏主题。取值:'default'、'dark'、'gray'
  6. confirmName:
    类型:string
    默认:'Ok'
    描述:确定按钮的文字
  7. cancelName:
    类型:string
    默认:'cancel'
    描述:取消按钮的文字
  8. sizeAutoName:
    类型:string
    默认:'auto'
    描述:菜单栏按钮文字
  9. sizeRawName:
    类型:string
    默认:'raw'
    描述:菜单栏按钮文字
  10. menuRotateName:
    类型:string
    默认:'Rotate'
    描述:菜单栏按钮文字
  11. root:
    类型:object
    必须:不通过slot方式在外部使用时,必须传。
    描述:取值为VuePictureCut实例

事件:

  1. onChange ({ blob, base64 }):监听图片最终裁剪导出的事件,即点击确认按钮
    blob:导出图片的Blob对象,可用于图片上传
    base64:导出图片的base64字符串,可用于图片上传
  2. onCancel ():监听点击取消按钮

4、Bezier对象

  import { Bezier } from 'vue-picture-cut';

  const bezier = Bezier();
  bezier.setOpt(Bezier.BEZIER['ease-in-out']);
  const y = bezier.getPoint(0.5);
  console.log(y);

(1) 静态属性BEZIER,是一个键值对,包含一些预设值

说明




linear

[0.0, 0.0, 1.0, 1.0]

线性过渡

ease

[0.25, 0.1, 0.25, 1.0]

平滑过渡

ease-in

[0.42, 0, 1.0, 1.0]

由慢到快

ease-out

[0, 0, 0.58, 1.0]

由快到慢

ease-in-out

[0.42, 0, 0.58, 1.0]

由慢到快再到慢

(2) 构造函数

一个无参的构造函数,内部调用了setOptByString('ease')方法

(3) 方法

方法名

说明

参数

返回值





setOpt

设置贝塞尔曲线类型

(arg: string , ParamsInterface = 'ease')

Bezier对象本身

setOptByString

设置贝塞尔曲线类型

BEZIER预设值(arg = 'ease')

Bezier对象本身

setOptByArr

设置贝塞尔曲线类型

(x1: number, y1: number, x2: number, y2: number)

Bezier对象本身

getPoint

返回x坐标对应的y坐标值

(x: number) 0~1之间

对应y坐标,0~1之间

(4) 参数ParamsInterface说明

ParamsInterface为包含4个number类型的数组。

5、 createAnimation方法

  import { createAnimation } from 'vue-picture-cut';

  const animation = createAnimation(option);

createAnimation会返回一个Animation对象

(1) 参数option

参数

说明

类型

可选值

必需

默认值







duration

动画持续时间,单位毫秒

number

——

false

1000

timing

动画的过渡类型

string、number[]

Bezier.BEZIER中的值,或者ParamsInterface类型

false

ease

delay

动画的延迟时间,单位毫秒

number

——

false

0

iteration

动画循环次数,infinite为无限循环

number、string

'infinite'或正整数

false

0

direction

动画在循环中是否反向运动

string

normal(默认,正向运动);reverse(反向运行);alternate(先正向,后反向,并交替);alternate-reverse(先反向,后正向,并交替)。

false

normal

change

回调函数,接收参数x,x在0~1之间,动画在这里处理

Function

——

false

——

end

回调函数,动画结束时执行

Function

——

false

——

(2) Animation对象方法

方法名

说明

参数

返回值





start

开始动画

——

Animation对象本身

abort

中止动画

——

——

6、 Tool对象

  import { Tool } from 'vue-picture-cut';

  Tool.loadImg('http://xxx.xxx.xxx/xxx.jpg')
  .then(image => {
    // 加载图片成功
    // image为Image对象
  }, () => {
    // 加载图片失败
  });

包含方法

  1. loadImg (src: string): Promise<HTMLImageElement>
    描述:载入图片
    参数 src:图片的链接
    返回 Promise:略
  2. rotatePoint(x: number, y: number, angle: number): Point
    描述:将一个点绕原点旋转angle度后,计算新的点的坐标
    参数 x:点的x坐标
    参数 y:点的y坐标
    参数 angle:旋转角度
    返回 Point:{x: number, y: number} 新的点
  3. clipBy (img: HTMLImageElement, width: number, height: number, showRect: RectFull, encoderOptions = 0.8, format = 'image/jpeg', pathDone?: PathDone): string
    描述:根据坐标剪裁图像
    参数 img:Image对象
    参数 width:导出图片的宽度(px)
    参数 height:导出图片的高度(px)
    参数 showRect:RectFull对象
    参数 encoderOptions:压缩率
    参数 format:导出图片的格式'image/jpeg'、'image/png'等
    参数 pathDone:自定义路径的方法PathDone
    返回 String:base64
  4. clipByRound (img: HTMLImageElement, width: number, height: number, showRect: RectFull, encoderOptions = 0.8, format = 'image/jpeg'): string
    描述:根据坐标内切圆剪裁图像
    参数 img:略
    参数 width:略
    参数 height:略
    参数 showRect:略
    参数 encoderOptions:略
    参数 format:略
    返回 String:base64
  5. clipByMax (img: HTMLImageElement, max = 2000, encoderOptions = 1): ClipResult | void
    描述:若图片宽或高大于max,则压缩图片
    参数 img:略
    参数 max:略
    参数 encoderOptions:略
    返回 ClipResult | void:返回ClipResult对象或undefined
  6. base64ToBlob (base64: string, format = 'image/jpeg'): Blob | null
    描述:将base64转Blob对象
    参数 base64:略
    参数 format:base64的格式
    返回 Blob | null:返回Blob对象或null
  7. getEllipseRectByRect(w: number, h: number, angle: number): Rect
    描述:将一个正矩形的内切椭圆旋转angle度,计算该椭圆的外接正矩形。(假设矩形中心为原点)
    参数 w:初始正矩形宽
    参数 h:初始正矩形高
    参数 angle:逆时针旋转角度
    返回 Rect:返回Rect对象
  8. getRectByRect(w: number, h: number, angle: number): Rect
    描述:将一个正矩形旋转angle度,计算该矩形的外接正矩形。(假设矩形中心为原点)
    参数 w:初始正矩形宽
    参数 h:初始正矩形高
    参数 angle:逆时针旋转角度
    返回 Rect:返回Rect对象

7、 createUtils方法

<template>
  <div>
	<input type="file" accept="image/*" @change="inputChange"/>
    <vue-picture-cut ref="pictureCut" :src="src"/>
    <button @click="doCut">裁剪</button>
  </div>
</template>

<script>
  import { VuePictureCut, createUtils } from 'vue-picture-cut';

  export default {
    // ...
    components: {
      VuePictureCut
    },
    data () {
      return {
        utils: null,
        src: null,
        blob: null,
        base64: null
      }
    },
    mounted() {
      this.utils = createUtils(this.$refs['pictureCut']);
    },
    methods: {
      inputChange(e) {
        const file = e.target.files[0];
        this.src = URL.createObjectURL(file);
      },
      doCut() {
        const res = this.utils.cut();
        if (res) {
            this.blob = res.file;   // BLOB对象
            this.base64 = res.src;  // base64字符串
        }
      }
    }
    // ...
  }
</script>

<style>
  @import "~vue-picture-cut/lib/vue-picture-cut.css";
</style>

包含方法

  1. cut(maxPixel?: number, encoderOptions?: number, format?: string): ClipResult | null
    描述:裁剪
    参数 maxPixel:导出图片的宽高中较长边的像素,不传时则依据实际图片大小自适应。
    参数 encoderOptions:压缩率
    参数 format:导出图片的格式'image/jpeg'、'image/png'等
    返回 ClipResult | null:略
  2. cut(opt?: { maxPixel?: number, encoderOptions?: number, format?: string }): ClipResult | null
    描述:裁剪
    参数 opt.maxPixel:导出图片的宽高中较长边的像素,不传时则依据实际图片大小自适应。
    参数 opt.encoderOptions:压缩率
    参数 opt.format:导出图片的格式'image/jpeg'、'image/png'等
    返回 ClipResult | null:略
  3. setMaskRound(isRound = true): void
    描述:设置裁剪框的形状。
    参数 isRound:true (圆形),false (矩形)。
  4. setMaskSize(w: number, h: number): void
    描述:设置剪裁框尺寸
    参数 w:比例宽
    参数 h:比例高
  5. setMaskSizeToOriginal (): void
    描述:按图片宽高比例设置剪裁框尺寸
  6. setMaskResize (resize = true): void
    描述:设置剪裁框是否可拖动改变大小
    参数 resize:略
  7. rotate (angle: number, animation = false): number | void
    描述:图片旋转
    参数 angle:逆时针角度
    参数 animation:是否进行动画
    返回 number | null:图片旋转后的逆时针角度
  8. rotateTo (angle: number, animation = false): void
    描述:图片旋转指定角度
    参数 angle:逆时针角度
    参数 animation:是否进行动画
  9. setFlipV(animation?: boolean): boolean | void
    描述:图片垂直翻转
    参数 animation:是否进行动画
    返回 boolean | null:和原图相比,是否翻转了,true (翻转),false (原始)。
  10. setFlipH(animation?: boolean): boolean | void
    描述:图片水平翻转
    参数 animation:是否进行动画
    返回 boolean | null:和原图相比,是否翻转了,true (翻转),false (原始)。
  11. setFlip (sV: boolean, sH: boolean, animation?: boolean): void
    描述:图片翻转
    参数 sV:垂直,true (翻转),false (原始)。
    参数 sH:水平,true (翻转),false (原始)。
    参数 animation:是否进行动画
  12. scale(zoom: number): void
    描述:图片缩放
    参数 zoom:缩放系数
  13. reset(): void
    描述:重置图片状态
  14. getOptions(): CutOptions | null
    描述:获取组件内部当前状态的参数。
    返回 CutOptions | null:略。

8、 内部对象说明

...待编辑

3、自定义扩展

暂时可以参考src/App.vue和src/lib/views/vue-picture-cut-menu.vue

3.1、自定义裁剪

...文档待编辑

3.2、自定义菜单栏

...文档待编辑

相关推荐

4万多吨豪华游轮遇险 竟是因为这个原因……

(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...

“菜鸟黑客”必用兵器之“渗透测试篇二”

"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...

科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白

作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...

麦子陪你做作业(二):KEGG通路数据库的正确打开姿势

作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...

知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势

智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...

每日新闻播报(September 14)_每日新闻播报英文

AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...

香港新巴城巴开放实时到站数据 供科技界研发使用

中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...

5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper

本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...

Qt动画效果展示_qt显示图片

今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...

如何从0到1设计实现一门自己的脚本语言

作者:dong...

三年级语文上册 仿写句子 需要的直接下载打印吧

描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...

C++|那些一看就很简洁、优雅、经典的小代码段

目录0等概率随机洗牌:1大小写转换2字符串复制...

二年级上册语文必考句子仿写,家长打印,孩子照着练

二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...

一年级语文上 句子专项练习(可打印)

...

亲自上阵!C++ 大佬深度“剧透”:C++26 将如何在代码生成上对抗 Rust?

...

取消回复欢迎 发表评论: