Vue-Cropper:全面掌握图片裁剪组件
Vue-Cropper 完全学习指南:Vue图片裁剪组件
🎯 什么是 Vue-Cropper?
Vue-Cropper 是一个简单易用的Vue图片裁剪组件,支持Vue2和Vue3。它提供了丰富的配置选项和回调方法,可以满足各种图片裁剪需求。
🌟 核心特点
- 简单易用:API设计简洁,快速上手
- 功能丰富:支持缩放、旋转、移动等操作
- 高度可配置:提供30+个配置选项
- 实时预览:支持实时预览裁剪效果
- 多种输出格式:支持jpeg、png、webp格式
- 响应式设计:适配移动端和桌面端
- Vue2/Vue3兼容:同时支持Vue 2.x和Vue 3.x
📦 安装与引入
NPM 安装
# Vue 2.x 版本
npm install vue-cropper# Vue 3.x 版本
npm install vue-cropper@next
引入方式
全局引入
// Vue 2.x
import Vue from 'vue'
import VueCropper from 'vue-cropper'
import 'vue-cropper/dist/index.css'Vue.use(VueCropper)// Vue 3.x
import { createApp } from 'vue'
import VueCropper from 'vue-cropper'
import 'vue-cropper/dist/index.css'const app = createApp({})
app.use(VueCropper)
局部引入
// Vue 2.x
import { VueCropper } from 'vue-cropper'
import 'vue-cropper/dist/index.css'export default {components: {VueCropper}
}// Vue 3.x
import VueCropper from 'vue-cropper'
import 'vue-cropper/dist/index.css'export default {components: {VueCropper}
}
🚀 基础使用
1. 基本示例
<template><div class="cropper-container"><!-- 图片裁剪组件 --><vue-cropperref="cropper":img="option.img":outputSize="option.outputSize":outputType="option.outputType":info="option.info":canScale="option.canScale":autoCrop="option.autoCrop":autoCropWidth="option.autoCropWidth":autoCropHeight="option.autoCropHeight":fixed="option.fixed":fixedNumber="option.fixedNumber"@realTime="realTime"@imgLoad="imgLoad"style="width: 100%; height: 400px;"></vue-cropper><!-- 控制按钮 --><div class="btn-group"><button @click="startCrop">开始裁剪</button><button @click="stopCrop">停止裁剪</button><button @click="clearCrop">清除裁剪</button><button @click="changeScale(1)">放大</button><button @click="changeScale(-1)">缩小</button><button @click="rotateLeft">左旋转</button><button @click="rotateRight">右旋转</button><button @click="getCropData">获取裁剪结果</button></div><!-- 实时预览 --><div class="preview-box"><div class="preview" :style="previews.div"><img :src="previews.url" :style="previews.img"></div></div></div>
</template><script>
import VueCropper from 'vue-cropper'export default {name: 'CropperDemo',components: {VueCropper},data() {return {option: {img: '/path/to/your/image.jpg', // 裁剪图片的地址outputSize: 1, // 裁剪生成图片的质量(0.1-1)outputType: 'jpeg', // 裁剪生成图片的格式info: true, // 显示裁剪框的大小信息canScale: true, // 图片是否允许滚轮缩放autoCrop: true, // 是否默认生成截图框autoCropWidth: 300, // 默认生成截图框宽度autoCropHeight: 200, // 默认生成截图框高度fixed: true, // 是否开启截图框宽高固定比例fixedNumber: [3, 2], // 截图框的宽高比例},previews: {}}},methods: {// 实时预览realTime(data) {this.previews = data},// 图片加载完成imgLoad(msg) {console.log('图片加载:', msg)},// 开始裁剪startCrop() {this.$refs.cropper.startCrop()},// 停止裁剪stopCrop() {this.$refs.cropper.stopCrop()},// 清除裁剪clearCrop() {this.$refs.cropper.clearCrop()},// 缩放changeScale(num) {this.$refs.cropper.changeScale(num)},// 左旋转rotateLeft() {this.$refs.cropper.rotateLeft()},// 右旋转rotateRight() {this.$refs.cropper.rotateRight()},// 获取裁剪结果getCropData() {// 获取base64数据this.$refs.cropper.getCropData((data) => {console.log('Base64结果:', data)})// 获取blob数据this.$refs.cropper.getCropBlob((data) => {console.log('Blob结果:', data)})}}
}
</script><style scoped>
.cropper-container {max-width: 800px;margin: 0 auto;
}.btn-group {margin: 20px 0;text-align: center;
}.btn-group button {margin: 0 5px;padding: 8px 16px;background: #007bff;color: white;border: none;border-radius: 4px;cursor: pointer;
}.btn-group button:hover {background: #0056b3;
}.preview-box {margin-top: 20px;
}.preview {width: 200px;height: 133px;overflow: hidden;border: 1px solid #ccc;margin: 0 auto;
}
</style>
⚙️ 配置选项详解
基础配置
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
img | 裁剪图片的地址 | String | 空 | url地址、base64、blob |
outputSize | 裁剪生成图片的质量 | Number | 1 | 0.1 ~ 1 |
outputType | 裁剪生成图片的格式 | String | jpg | jpeg、png、webp |
info | 图片的信息展示 | Boolean | true | true、false |
canScale | 图片是否允许滚轮缩放 | Boolean | true | true、false |
裁剪框配置
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
autoCrop | 是否默认生成截图框 | Boolean | false | true、false |
autoCropWidth | 默认生成截图框宽度 | Number | 容器的80% | 0 ~ max |
autoCropHeight | 默认生成截图框高度 | Number | 容器的80% | 0 ~ max |
fixed | 是否开启截图框宽高固定比例 | Boolean | false | true、false |
fixedNumber | 截图框的宽高比例 | Array | [1, 1] | [宽度, 高度] |
fixedBox | 固定截图框大小不允许改变 | Boolean | false | true、false |
centerBox | 截图框是否被限制在图片里面 | Boolean | false | true、false |
交互配置
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
canMove | 上传图片是否可以移动 | Boolean | true | true、false |
canMoveBox | 截图框能否拖动 | Boolean | true | true、false |
original | 上传图片按照原始比例渲染 | Boolean | false | true、false |
full | 是否输出原图比例的截图 | Boolean | false | true、false |
high | 是否按照设备的dpr输出等比例图片 | Boolean | true | true、false |
高级配置
参数 | 说明 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
infoTrue | true为展示真实输出图片宽高,false展示看到的截图框宽高 | Boolean | false | true、false |
maxImgSize | 限制图片最大宽度和高度 | Number | 2000 | 0 ~ max |
enlarge | 图片根据截图框输出比例倍数 | Number | 1 | 0 ~ max |
mode | 图片默认渲染方式 | String | contain | contain、cover、100px、100% auto |
limitMinSize | 裁剪框限制最小区域 | Number/Array/String | 10 | Number、Array、String |
fillColor | 导出时背景颜色填充 | String | 空 | #ffffff、white |
🔄 回调方法
@realTime 实时预览事件
methods: {realTime(data) {console.log('实时预览数据:', data)/*data 包含以下属性:{img: '...', // 裁剪的图片base64w: 200, // 裁剪框宽度h: 100, // 裁剪框高度div: {...}, // 预览容器样式url: '...' // 图片地址}*/// 设置预览样式this.previews = data// 自定义预览大小this.previewStyle1 = {width: data.w + 'px',height: data.h + 'px',overflow: 'hidden',margin: '0',zoom: 0.5 // 缩放比例}}
}
@imgMoving 图片移动回调
methods: {imgMoving(data) {console.log('图片移动:', data)/*data 包含:{moving: true, // 是否在移动axis: {x1: 100, // 左上角x坐标x2: 300, // 右下角x坐标y1: 50, // 左上角y坐标y2: 200 // 右下角y坐标}}*/}
}
@cropMoving 截图框移动回调
methods: {cropMoving(data) {console.log('截图框移动:', data)// 数据结构与imgMoving相同}
}
@imgLoad 图片加载回调
methods: {imgLoad(msg) {if (msg === 'success') {console.log('图片加载成功')} else {console.log('图片加载失败')}}
}
🛠️ 内置方法
裁剪控制方法
// 开始裁剪
this.$refs.cropper.startCrop()// 停止裁剪
this.$refs.cropper.stopCrop()// 清除裁剪框
this.$refs.cropper.clearCrop()// 自动生成截图框
this.$refs.cropper.goAutoCrop()
图片操作方法
// 缩放图片 (正数放大,负数缩小)
this.$refs.cropper.changeScale(1) // 放大
this.$refs.cropper.changeScale(-1) // 缩小// 旋转图片
this.$refs.cropper.rotateLeft() // 左旋转90度
this.$refs.cropper.rotateRight() // 右旋转90度
获取坐标信息
// 获取图片基于容器的坐标点
const imgAxis = this.$refs.cropper.getImgAxis()// 获取截图框基于容器的坐标点
const cropAxis = this.$refs.cropper.getCropAxis()// 获取截图框宽高
const cropW = this.$refs.cropper.cropW
const cropH = this.$refs.cropper.cropH
获取裁剪结果
// 获取base64格式
this.$refs.cropper.getCropData((data) => {console.log('Base64数据:', data)// 可以直接用于img标签的srcthis.resultImg = data
})// 获取blob格式
this.$refs.cropper.getCropBlob((data) => {console.log('Blob数据:', data)// 可以用于FormData上传const formData = new FormData()formData.append('file', data, 'cropped.jpg')
})
🎨 实际应用案例
案例1:头像上传裁剪
<template><div class="avatar-upload"><!-- 文件选择 --><input type="file" ref="fileInput"@change="handleFileChange"accept="image/*"style="display: none"><!-- 当前头像展示 --><div class="current-avatar" @click="selectFile"><img v-if="avatarUrl" :src="avatarUrl" alt="头像"><div v-else class="avatar-placeholder">点击上传头像</div></div><!-- 裁剪弹窗 --><div v-if="showCropper" class="cropper-modal"><div class="cropper-content"><h3>裁剪头像</h3><vue-cropperref="cropper":img="tempImage":outputSize="1":outputType="'jpeg'":autoCrop="true":autoCropWidth="200":autoCropHeight="200":fixed="true":fixedNumber="[1, 1]":centerBox="true"style="width: 100%; height: 400px;"></vue-cropper><div class="cropper-buttons"><button @click="cancelCrop">取消</button><button @click="confirmCrop">确认</button></div></div></div></div>
</template><script>
export default {data() {return {avatarUrl: '',tempImage: '',showCropper: false}},methods: {selectFile() {this.$refs.fileInput.click()},handleFileChange(e) {const file = e.target.files[0]if (!file) return// 验证文件类型if (!file.type.startsWith('image/')) {alert('请选择图片文件')return}// 验证文件大小 (5MB)if (file.size > 5 * 1024 * 1024) {alert('图片大小不能超过5MB')return}// 读取文件并显示裁剪器const reader = new FileReader()reader.onload = (e) => {this.tempImage = e.target.resultthis.showCropper = true}reader.readAsDataURL(file)},cancelCrop() {this.showCropper = falsethis.tempImage = ''this.$refs.fileInput.value = ''},confirmCrop() {this.$refs.cropper.getCropBlob((blob) => {// 上传到服务器this.uploadAvatar(blob)})},async uploadAvatar(blob) {const formData = new FormData()formData.append('avatar', blob, 'avatar.jpg')try {const response = await fetch('/api/upload-avatar', {method: 'POST',body: formData})const result = await response.json()if (result.success) {this.avatarUrl = result.urlthis.showCropper = falsethis.tempImage = ''alert('头像上传成功')}} catch (error) {console.error('上传失败:', error)alert('上传失败,请重试')}}}
}
</script><style scoped>
.current-avatar {width: 100px;height: 100px;border-radius: 50%;overflow: hidden;cursor: pointer;border: 2px solid #ddd;display: flex;align-items: center;justify-content: center;
}.current-avatar img {width: 100%;height: 100%;object-fit: cover;
}.avatar-placeholder {color: #999;font-size: 12px;text-align: center;
}.cropper-modal {position: fixed;top: 0;left: 0;right: 0;bottom: 0;background: rgba(0, 0, 0, 0.8);display: flex;align-items: center;justify-content: center;z-index: 1000;
}.cropper-content {background: white;padding: 20px;border-radius: 8px;width: 90%;max-width: 600px;
}.cropper-buttons {margin-top: 20px;text-align: center;
}.cropper-buttons button {margin: 0 10px;padding: 8px 20px;border: none;border-radius: 4px;cursor: pointer;
}
</style>
案例2:商品图片批量裁剪
<template><div class="batch-cropper"><h2>商品图片批量裁剪</h2><!-- 上传区域 --><div class="upload-area" @drop="handleDrop" @dragover.prevent><input type="file" ref="fileInput"@change="handleFileSelect"multipleaccept="image/*"style="display: none"><button @click="selectFiles">选择图片</button><p>或拖拽图片到此区域</p></div><!-- 图片列表 --><div class="image-list"><div v-for="(item, index) in imageList" :key="index"class="image-item":class="{ active: currentIndex === index }"@click="selectImage(index)"><img :src="item.preview" alt=""><div class="image-status"><span v-if="item.cropped" class="status-success">✓</span><span v-else class="status-pending">○</span></div></div></div><!-- 裁剪区域 --><div v-if="currentImage" class="cropper-area"><vue-cropperref="cropper":img="currentImage.src":outputSize="0.8":outputType="'jpeg'":autoCrop="true":autoCropWidth="300":autoCropHeight="300":fixed="true":fixedNumber="[1, 1]"style="width: 100%; height: 400px;"></vue-cropper><div class="cropper-controls"><button @click="prevImage" :disabled="currentIndex === 0">上一张</button><button @click="cropCurrent">裁剪当前图片</button><button @click="nextImage" :disabled="currentIndex === imageList.length - 1">下一张</button><button @click="batchCrop" class="batch-btn">批量裁剪</button></div></div><!-- 结果展示 --><div v-if="croppedImages.length" class="results"><h3>裁剪结果</h3><div class="result-grid"><div v-for="(result, index) in croppedImages" :key="index" class="result-item"><img :src="result.url" alt=""><button @click="downloadImage(result, index)">下载</button></div></div></div></div>
</template><script>
export default {data() {return {imageList: [],currentIndex: 0,croppedImages: []}},computed: {currentImage() {return this.imageList[this.currentIndex] || null}},methods: {selectFiles() {this.$refs.fileInput.click()},handleFileSelect(e) {this.processFiles(e.target.files)},handleDrop(e) {e.preventDefault()this.processFiles(e.dataTransfer.files)},processFiles(files) {Array.from(files).forEach(file => {if (file.type.startsWith('image/')) {const reader = new FileReader()reader.onload = (e) => {this.imageList.push({file,src: e.target.result,preview: e.target.result,cropped: false})}reader.readAsDataURL(file)}})},selectImage(index) {this.currentIndex = index},prevImage() {if (this.currentIndex > 0) {this.currentIndex--}},nextImage() {if (this.currentIndex < this.imageList.length - 1) {this.currentIndex++}},cropCurrent() {this.$refs.cropper.getCropData((data) => {this.croppedImages.push({url: data,originalIndex: this.currentIndex})this.imageList[this.currentIndex].cropped = true// 自动切换到下一张if (this.currentIndex < this.imageList.length - 1) {this.nextImage()}})},batchCrop() {const uncroppedImages = this.imageList.filter(item => !item.cropped)if (uncroppedImages.length === 0) {alert('所有图片都已裁剪完成')return}if (confirm(`还有${uncroppedImages.length}张图片未裁剪,是否使用当前设置批量裁剪?`)) {this.processBatchCrop()}},processBatchCrop() {// 这里可以实现批量裁剪逻辑// 由于vue-cropper需要逐个处理,这里示例批量应用相同设置alert('批量裁剪功能开发中...')},downloadImage(result, index) {const link = document.createElement('a')link.href = result.urllink.download = `cropped-image-${index + 1}.jpg`link.click()}}
}
</script><style scoped>
.upload-area {border: 2px dashed #ccc;padding: 40px;text-align: center;margin-bottom: 20px;border-radius: 8px;
}.upload-area:hover {border-color: #007bff;
}.image-list {display: flex;gap: 10px;margin-bottom: 20px;overflow-x: auto;
}.image-item {position: relative;width: 80px;height: 80px;cursor: pointer;border: 2px solid transparent;border-radius: 4px;
}.image-item.active {border-color: #007bff;
}.image-item img {width: 100%;height: 100%;object-fit: cover;border-radius: 4px;
}.image-status {position: absolute;top: -5px;right: -5px;width: 20px;height: 20px;border-radius: 50%;background: white;display: flex;align-items: center;justify-content: center;border: 1px solid #ccc;
}.status-success {color: green;
}.cropper-controls {margin-top: 20px;text-align: center;
}.cropper-controls button {margin: 0 5px;padding: 8px 16px;border: none;border-radius: 4px;cursor: pointer;
}.batch-btn {background: #28a745 !important;color: white;
}.results {margin-top: 40px;
}.result-grid {display: grid;grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));gap: 20px;
}.result-item {text-align: center;
}.result-item img {width: 100%;border-radius: 4px;border: 1px solid #ddd;
}
</style>
🔧 最佳实践
1. 性能优化
// 大图片预处理
methods: {async processLargeImage(file) {// 压缩图片尺寸const canvas = document.createElement('canvas')const ctx = canvas.getContext('2d')const img = new Image()return new Promise((resolve) => {img.onload = () => {const maxSize = 1920let { width, height } = imgif (width > maxSize || height > maxSize) {if (width > height) {height = (height * maxSize) / widthwidth = maxSize} else {width = (width * maxSize) / heightheight = maxSize}}canvas.width = widthcanvas.height = heightctx.drawImage(img, 0, 0, width, height)resolve(canvas.toDataURL('image/jpeg', 0.8))}img.src = URL.createObjectURL(file)})}
}
2. 移动端适配
/* 移动端样式 */
@media (max-width: 768px) {.vue-cropper {height: 300px !important;}.cropper-controls {display: flex;flex-direction: column;gap: 10px;}.cropper-controls button {width: 100%;padding: 12px;}
}
3. 错误处理
methods: {handleError(error) {console.error('裁剪错误:', error)// 用户友好的错误提示const errorMessages = {'file-too-large': '文件太大,请选择小于5MB的图片','invalid-format': '不支持的图片格式','crop-failed': '裁剪失败,请重试'}this.showMessage(errorMessages[error.type] || '操作失败,请重试')},showMessage(message) {// 实现消息提示alert(message)}
}
🎯 总结
Vue-Cropper 是一个功能强大的Vue图片裁剪组件,它提供了:
✅ 丰富的配置选项:满足各种裁剪需求
✅ 完整的API接口:支持所有常用操作
✅ 实时预览功能:提供良好的用户体验
✅ 多种输出格式:支持不同的应用场景
✅ Vue2/Vue3兼容:适配不同版本的Vue项目
✅ 移动端友好:支持触摸操作和响应式设计
通过合理使用Vue-Cropper,您可以轻松实现头像上传、商品图片处理、证件照裁剪等功能,为用户提供专业的图片处理体验。
开始您的图片裁剪之旅吧! 📸
💡 开发建议:在实际项目中,建议结合文件上传、图片压缩、格式转换等功能,构建完整的图片处理流程。
相关文章:
Vue-Cropper:全面掌握图片裁剪组件
Vue-Cropper 完全学习指南:Vue图片裁剪组件 🎯 什么是 Vue-Cropper? Vue-Cropper 是一个简单易用的Vue图片裁剪组件,支持Vue2和Vue3。它提供了丰富的配置选项和回调方法,可以满足各种图片裁剪需求。 🌟 …...

建造者模式:优雅构建复杂对象
引言 在软件开发中,有时我们需要创建一个由多个部分组成的复杂对象,这些部分可能有不同的变体或配置。如果直接在一个构造函数中设置所有参数,代码会变得难以阅读和维护。当对象构建过程复杂,且需要多个步骤时,我们可…...

现场总线结构在楼宇自控系统中的技术要求与实施要点分析
在建筑智能化程度不断提升的当下,楼宇自控系统承担着协调建筑内各类设备高效运行的重任。传统的集中式控制系统在面对复杂建筑环境时,逐渐暴露出布线繁琐、扩展性差、可靠性低等问题。而现场总线结构凭借其分散控制、通信高效等特性,成为楼宇…...
Axure组件即拖即用:垂直折叠菜单(动态展开/收回交互)
亲爱的小伙伴,在您浏览之前,请关注一下,在此深表感谢!如有帮助请订阅专栏!免费哦! 你是不是也这样崩溃过? 明明设置了点击交互,菜单却像死机一样纹丝不动,F5按烂了都没反…...

学习路之PHP--easyswoole使用视图和模板
学习路之PHP--easyswoole使用视图和模板 一、安装依赖插件二、 实现渲染引擎三、注册渲染引擎四、测试调用写的模板五、优化六、最后补充 一、安装依赖插件 composer require easyswoole/template:1.1.* composer require topthink/think-template相关版本: "…...

《云原生安全攻防》-- K8s网络策略:通过NetworkPolicy实现微隔离
默认情况下,K8s集群的网络是没有任何限制的,所有的Pod之间都可以相互访问。这就意味着,一旦攻击者入侵了某个Pod,就能够访问到集群中任意Pod,存在比较大的安全风险。 在本节课程中,我们将详细介绍如何通过N…...

06 APP 自动化- H5 元素定位
文章目录 H5 元素定位1、APP 分类2、H5 元素3、H5 元素定位环境的搭建4、代码实现: H5 元素定位 1、APP 分类 1、Android 原生 APP2、混合 APP(Android 原生控件H5页面)3、纯 H5 App 2、H5 元素 H5 元素容器 WebViewWebView 控件实现展示网页 3、H5 元素定位环…...
Axure疑难杂症:中继器新增数据时如何上传并存储图片(玩转中继器)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 案例视频: 中继器新增数据时如何上传并存储图片 课程主题:中继器新增数据时如何上传并存储图片 主…...

定时线程池失效问题引发的思考
最近在做的一个新功能,在结果探测的时候使用了定时线程池和普通线程池结合,定时线程池周期性创建子任务并往普通线程池提交任务。 问题: 在昨天测试老师发现,业务实际上已经成功了,但是页面还是一直显示进行中。 收到…...
Vue-ref 与 props
一、前言 在 Vue 的组件化开发中,父子组件之间的数据传递 是一个非常核心的需求。常见的场景包括: 父组件向子组件传递数据;子组件向父组件发送事件或数据;父组件直接调用子组件的方法或访问其属性。 Vue 提供了多种机制来实现…...

AXURE安装+汉化-Windows
安装网站:https://www.axure.com/release-history/rp9 Axure中文汉化包下载地址 链接:https://pan.baidu.com/s/1U62Azk8lkRPBqWAcrJMFew?pwd5418 提取码:5418 下载完成之后,crtlc lang文件夹 到下载的Axure路径下 双击点进这个目录里面。ctrlv把lan…...

ArcGIS Pro字段计算器与计算几何不可用,显示灰色
“字段计算器”不可用 如果计算字段命令不可用,请考虑以下可能性: 由 ArcGIS 管理的字段无法手动编辑。因此,无法计算 ObjectID(OID 或 FID)字段或地理数据库要素类的 Shape_Length 和 Shape_Area 字段的字段值。表中…...

mac电脑安装 nvm 报错如何解决
前言 已知:安装nvm成功;终端输入nvm -v 有版本返回 1. 启动全局配置环境变量失败 source ~/.zshrc~ 返回: source: no such file or directory: /Users/你的用户名/.zshrc~2 安装node失败 nvm install 16.13返回: mkdir: /U…...

第11节 Node.js 模块系统
为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的…...

上海工作机会:Technical Writer Senior Technical Writer - 中微半导体设备
大名鼎鼎的中微半导体招聘文档工程师了,就是那家由中国半导体产业的领军人物尹志尧领导的、全员持股的公司。如果你还不了解他,赶快Deepseek一下“尹志尧”了解。 招聘职位:Technical Writer & Senior Technical Writer 公司名称&#…...
String 学习总结
1. 存储机制 短字符串优化(SSO, Small String Optimization) 现代标准库中的字符串实现普遍采用 SSO 技术,将长度较短(例如 ≤15 字节)的字符串数据直接存储在字符串对象内部的固定缓冲区(栈上)…...

Python微积分可视化:从导数到积分的交互式教学工具
Python微积分可视化:从导数到积分的交互式教学工具 一、引言 微积分是理解自然科学的基础,但抽象的导数、积分概念常让初学者感到困惑。本文基于Matplotlib开发一套微积分可视化工具,通过动态图像直观展示导数的几何意义、积分的近似计算及跨学科应用,帮助读者建立"数…...

Juce实现Table自定义
Juce实现Table自定义 一.总体展示概及概述 在项目中Juce中TableList往往无法满足用户需求,头部和背景及背景颜色设置以及在Cell中添加自定义按钮,所以需要自己实现自定义TabelList,该示例是展示实现自定义TableList,实现自定义标…...
【25.06】fabric进行caliper测试加环境部署
前置条件 安装一个Ubuntu20+的镜像 基础环境安装 Git cURL vim jq sudo apt install -y git curl vim jq Docker和Docker-compose 这个命令会自动安装docker sudo apt install docker-compose sudo chmod +x /usr/bin/docker-compose docker versiondocker-compose vers…...

【后端高阶面经:架构篇】51、搜索引擎架构与排序算法:面试关键知识点全解析
一、搜索引擎核心基石:倒排索引技术深度解析 (一)倒排索引的本质与构建流程 倒排索引(Inverted Index)是搜索引擎实现快速检索的核心数据结构,与传统数据库的正向索引(文档→关键词࿰…...

Windows应用-音视频捕获
下载“Windows应用-音视频捕获”项目 本应用可以同时捕获4个视频源和4个音频源,可以监视视频源图像,监听音频源;可以将视频源图像写入MP4文件,将音频源写入MP3或WAV文件;还可以录制系统播放的声音。本应用使用MFC对话框…...

【OCCT+ImGUI系列】012-Geom2d_AxisPlacement
Geom2d_AxisPlacement 教学笔记 一、类概述 Geom2d_AxisPlacement 表示二维几何空间中的一个坐标轴(轴系),由两部分组成: gp_Pnt2d:原点(Location)gp_Dir2d:单位方向向量ÿ…...
优化WP外贸建站提升用户体验
WordPress作为一个强大的建站工具,通过合理的优化,可以提升用户体验,吸引更多潜在客户。本文将为您介绍一些优化WordPress外贸建站的实用建议。 1. 响应式设计 随着移动设备的普及,确保您的WordPress网站具有响应式设计变得至关…...

【C++高并发内存池篇】性能卷王养成记:C++ 定长内存池,让内存分配快到飞起!
📝本篇摘要 在本篇将介绍C定长内存池的概念及实现问题,引入内存池技术,通过实现一个简单的定长内存池部分,体会奥妙所在,进而为之后实现整体的内存池做铺垫! 🏠欢迎拜访🏠ÿ…...

mac下通过anaconda安装Python
本次分享mac下通过anaconda安装Python、Jupyter Notebook、R。 anaconda安装 点击👉https://www.anaconda.com/download, 点击Mac系统安装包, 选择Mac芯片:苹果芯片 or intel芯片, 选择苹果芯片图形界面安装&#x…...
第3篇:数据库路由模块设计与 SQL 路由策略解析
3.1 什么是数据库路由? 在分库分表或多数据库实例架构中,**数据库路由模块(SQL Router)**的作用是: 将客户端发来的 SQL 请求路由到正确的后端数据库实例或分片表中执行。 它是数据库中间件的核心组件之一。 3.2 数据…...
ARINC818编解码设计FPGA实现
一、设计内容 1.基于xilinx平台进行系列产品设计 2.基于GT高速进行进行设计 3.提供良好的技术支持和售后服务 4.比较详细的代码注释 二、模块设计内容 1.模块顶层设计 2.编码模块部分设计 内容包括: 帧信息产生/ojbect0帧格式产生和发送/object2_object3帧格式产生…...

微软PowerBI考试 PL300-Power BI 入门
Power BI 入门 上篇更新了微软PowerBI考试 PL-300学习指南,今天分享PowerBI入门学习内容。 简介 Microsoft Power BI 是一个完整的报表解决方案,通过开发工具和联机平台提供数据准备、数据可视化、分发和管理。 Power BI 可以从使用单个数据源的简单…...
逻辑回归知识点
一、逻辑回归概念 逻辑回归(Logistic Regression)是一种广泛应用于分类问题的统计方法,尤其适用于二分类问题。 注意: 尽管名称中有"回归"二字,但它实际上是一种分类算法。 解决二分类的问题。 API:sklearn.linear_model.Logis…...
YARN架构解析:大数据资源管理核心
一、YARN的设计目标 解耦资源管理与作业调度:将资源管理(Resource Management)和任务执行(Task Execution)分离,提升集群资源利用率。支持多种计算框架:不再局限于MapRedu…...