基于Canvas的图片切割器
背景
更新:QQ 早就把九宫格模式换掉了,所以这个项目已经很大程度上可以说是没用了。
先上地址:https://kifuan.github.io/photo-cutter/
由于某群友有切割图片放到个人资料里面的需求,所以我就顺手写了一个这样的项目。
效果
如下:
原理
来源: MDN
利用CanvasRenderingContext2D.drawImage
对图片进行处理,API如下:
1 | ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) |
用下面这张图就可以解释清楚:
因为我们并不需要调整这么多的参数,举个栗子,把一张300x400
的从100, 200
的位置截出一个100x100
的图片,我们需要这么做:
1 | ctx.drawImage(image, 100, 200, 100, 100, 0, 0, 100, 100) |
并不需要记住每个参数的位置,毕竟记不住可以查文档嘛。
实现
目标
目标其实很简单,我们要把一张大图切割成下面的形式:
忽略我作画的渣水平,就当每个格子都是正方形,所以说它的宽高比应当是3:4
。
策略模式的应用
因为我们有多种切割图片的策略,所以这里可以应用策略模式。
说白了就是把那一堆参数放到一个对象里面,如下:
1 | // src/stores/strategy.ts |
计算标准长度
看起来挺吓人,实际上核心很简单,就是根据期望比例算出来标准数据,实际上是一个数学问题。
1 | // src/components/PhotoFragments.vue |
画到canvas上
在此之前,我们先给出Vue模板代码,用来动态生成canvas
:
1 | <template> |
在这里,我向ref
里面传了一个函数,它可以把canvas
的DOM
保存到canvases
这个数组里面。
因为前面还定义了一些变量,这里不方便进行代码块的截取,索性都贴出来了,除了calcRegularData
这个函数。
1 | // src/components/PhotoFragments.vue |
就这样,核心代码就这些,store
定义的部分我就省去了,都是大同小异的代码。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 喵喵小窝!