1. 简介
随着移动设备的发展,用户对于图片处理的需求也越来越多。裁剪是图片处理中常用的一种操作,它可以将一张大图剪裁成我们想要的大小和尺寸。本文将介绍如何在uniapp中实现图片裁剪效果。
2. 前置知识
在了解如何实现图片裁剪效果之前,我们需要掌握以下知识:
2.1 canvas
canvas 是 HTML5 中新增的标签之一,用于在页面中绘制图形、动画等等。通过 JavaScript 脚本,我们可以在 canvas 上绘制不同形状的线条、路径、矩形、圆形、文字等等,从而实现各种效果。
var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');
2.2 uniapp
uniapp 是一款基于 Vue.js 的开发框架,可以快速和高效地构建跨平台应用,支持生成 iOS、Android、H5 等客户端。
// 在 uniapp 中创建一个页面
<template>
<view>
Hello, uniapp!
</view>
</template>
<script>
export default {
name: 'HelloUniapp'
}
</script>
3. 实现过程
接下来,我们将介绍如何在 uniapp 中实现图片裁剪效果。
3.1 图片上传
首先,我们需要实现图片上传的功能,让用户能够选择一张图片进行裁剪。
// 创建上传组件
<template>
<view>
<image :src="imageSrc" mode="aspectFit" />
<button @tap="uploadImage">上传图片</button>
</view>
</template>
<script>
export default {
data() {
return {
imageSrc: ''
}
},
methods: {
// 选择图片并上传
uploadImage() {
uni.chooseImage({
count: 1,
success: (res) => {
this.imageSrc = res.tempFilePaths[0];
},
fail: (err) => {
console.log(err);
}
})
}
}
}
</script>
以上代码实现了一个上传图片的组件,当用户点击上传图片按钮时,会调用 uni.chooseImage 方法弹出系统选择图片的界面,选择一张图片后会将它展示在页面上。
3.2 图片裁剪
接下来,我们需要实现图片的裁剪功能。我们可以使用 canvas 对图片进行剪裁。
// 创建裁剪组件
<template>
<view>
<canvas id="cut-canvas" ref="cutCanvas" @touchstart="touchStart" @touchmove="touchMove" @touchend="touchEnd" />
<button @tap="cropImage">裁剪图片</button>
</view>
</template>
<script>
export default {
data() {
return {
canvasWidth: 0, // canvas 宽度
canvasHeight: 0, // canvas 高度
startX: 0, // 起始点 x
startY: 0, // 起始点 y
endX: 0, // 结束点 x
endY: 0, // 结束点 y
isDrawing: false // 是否正在绘制
}
},
mounted() {
// 获取 canvas 宽度和高度
const query = uni.createSelectorQuery().in(this);
query.select('#cut-canvas').boundingClientRect((rect) => {
this.canvasWidth = rect.width;
this.canvasHeight = rect.height;
}).exec();
},
methods: {
// 触摸开始
touchStart(e) {
const {x, y} = e.touches[0];
this.startX = x;
this.startY = y;
this.isDrawing = true;
},
// 触摸移动
touchMove(e) {
if (!this.isDrawing) return;
const ctx = uni.createCanvasContext('cut-canvas', this);
ctx.clearRect(0, 0, this.canvasWidth, this.canvasHeight);
ctx.drawImage(this.imageSrc, 0, 0, this.canvasWidth, this.canvasHeight);
const {x, y} = e.touches[0];
this.endX = x;
this.endY = y;
ctx.strokeRect(this.startX, this.startY, this.endX - this.startX, this.endY - this.startY);
ctx.draw();
},
// 触摸结束
touchEnd() {
this.isDrawing = false;
},
// 裁剪图片
cropImage() {
const ctx = uni.createCanvasContext('cut-canvas', this);
const imageWidth = this.endX - this.startX;
const imageHeight = this.endY - this.startY;
const x = this.startX;
const y = this.startY;
ctx.drawImage(this.imageSrc, x, y, imageWidth, imageHeight, 0, 0, imageWidth, imageHeight);
ctx.draw(false, () => {
uni.canvasToTempFilePath({
canvasId: 'cut-canvas',
fileType: 'jpg',
success: (res) => {
// 裁剪完成后的图片路径 res.tempFilePath
},
fail: (err) => {
console.log(err);
}
}, this);
});
}
}
}
</script>
以上代码实现了一个裁剪组件,当用户在 canvas 上按下手指时,会记录起始点的位置;当用户移动手指时,会清除 canvas 上的内容并绘制一个矩形框,矩形框的大小和位置由起始点和当前手指位置得出;当用户松开手指时,会停止绘制矩形框并进行裁剪,将裁剪后的图片输出到一个新的 canvas 中,然后通过 uni.canvasToTempFilePath 将 canvas 中的内容保存为图片并返回图片的路径。
4. 总结
本文介绍了如何在 uniapp 中实现图片裁剪效果。首先,我们需要实现图片上传功能,让用户能够选择一张图片进行裁剪;接着,我们使用 canvas 对图片进行剪裁,并返回裁剪后的图片路径。通过以上步骤,我们可以快速地实现图片裁剪功能,提升用户体验。