首页
更多应用
Search
1
修改iview的标签为i-的形式而不是驼峰的形式
3,148 阅读
2
PHP微信和企业微信签名
2,881 阅读
3
在VUE中怎么全局引入sass文件
2,522 阅读
4
解决Macos下storm系列IDE卡顿的问题
2,231 阅读
5
vscode硬件占用较高解决方案
2,185 阅读
默认分类
JS
VUE
CSS
mac使用技巧
React
fastmock
登录
/
注册
Search
标签搜索
react
js
vue
vscode
nodejs
项目
代码
webpack
工具
nginx
小程序
css
fastmock
eslint
npm
http
vue-cli3
git
浏览器
const
fastmock技术社区
累计撰写
105
篇文章
累计收到
26
条评论
首页
栏目
默认分类
JS
VUE
CSS
mac使用技巧
React
fastmock
页面
更多应用
搜索到
59
篇与
的结果
2025-07-21
小程序给图片添加水印(时间,经纬度信息)
在移动互联网时代,小程序因其轻量、便捷的特性,逐渐成为用户日常生活中不可或缺的工具。无论是社交、购物,还是记录生活,小程序都提供了丰富的功能。然而,随着用户对数据安全和信息追溯需求的增加,如何在图片中添加关键信息(如时间、经纬度等)成为开发者需要解决的问题之一。尤其是在一些特定场景下,如户外打卡、旅行记录、证据留存等,为图片添加时间戳和地理位置信息不仅能增强数据的可信度,还能为用户提供更丰富的上下文信息。本文将详细介绍如何在小程序中实现为图片添加时间、经纬度信息的水印功能。我们将从获取用户地理位置、格式化时间信息,到将水印动态添加到图片中,一步步讲解实现过程。无论你是小程序开发新手,还是有一定经验的开发者,都能通过本文掌握这一实用技能,为你的小程序增添更多实用价值。让我们一起探索如何通过技术手段,让每一张图片都“有迹可循”。实现思路如下:1、使用小程序的canvas来绘制图片,画布的大小根据图片的实际宽高设置2、在画布中左下角位置一个黑色半透明的矩形3、在矩形上绘制文本,文本内容为时间和经纬度4、使用 wx.canvasToTempFilePath 方法将canvas内容导出成图片缓存到小程序本地存储5、使用 wx.compressImage 压缩图片,这一步很重要,因为通过canvas直接导出的图片非常大,所以要根据情况压缩图片import moment from '../../utils/moment'; export const addWatermark = (pageIns, imgpath, position) => { const time = moment().format('YYYY-MM-DD HH:mm:ss'); return new Promise((resolve, reject) => { const dataSrc = imgpath; const query = pageIns.createSelectorQuery(); console.log('query canvas result', query); query.select('#watermark-canvas') .fields({ node: true, size: true }) .exec(async (res) => { console.log('query canvas result', res); const canvas = res[0].node; const ctx = canvas.getContext('2d'); // 加载图片 const img = canvas.createImage(); img.src = dataSrc; // 替换为你的图片地址 img.onload = () => { // 获取原图的宽高 const imgWidth = img.width; const imgHeight = img.height; console.log('待压缩图片宽高', imgWidth, imgHeight); // 设置 Canvas 的实际宽高为原图的宽高 const dpr = wx.getSystemInfoSync().pixelRatio; canvas.width = imgWidth * dpr; canvas.height = imgHeight * dpr; ctx.scale(dpr, dpr); // 绘制图片 ctx.drawImage(img, 0, 0, imgWidth, imgHeight); // 绘制黑色半透明矩形块 ctx.fillStyle = 'rgba(0, 0, 0, 0.5)'; // ctx.fillRect(0, imgHeight - 60, imgWidth, 60); // 矩形块位于图片底部 ctx.fillRect(0, imgHeight - 60, 210, 60); // 绘制水印文本 ctx.font = '16px sans-serif'; ctx.fillStyle = '#ffffff'; ctx.fillText(time, 20, imgHeight - 35); // 文本位于矩形块内 ctx.fillText(position.latitude + '--' + position.longitude, 20, imgHeight - 14); // 文本位于矩形块内 // 生成临时文件路径 wx.canvasToTempFilePath({ canvas, fileType: 'jpg', destWidth: imgWidth, destHeight: imgHeight, quality: 0.5, success: (res) => { const tempFilePath = res.tempFilePath; wx.compressImage({ src: tempFilePath, // 图片路径 quality:60, // 压缩质量 success({tempFilePath: tempPathAfterCompress}) { console.log("压缩成功", tempPathAfterCompress) wx.getFileInfo({ filePath: tempPathAfterCompress, success(resInfo) { console.log('添加水印后文件大小(KB):', (resInfo.size / 1024).toFixed(2)); // 输出文件大小(KB),保留两位小数 console.log('添加水印后文件大小(MB):', (resInfo.size / (1024 * 1024)).toFixed(2)); // 输出文件大小(MB),保留两位小数 }, fail(err) { console.error('图片添加水印->获取文件信息失败', err); } }); resolve(tempPathAfterCompress); } }) }, fail: (error) => { console.info('给图片加水印,导出canvas处理后的图片错误', error) } }); }; }); }); } export const batchAddWatermark = (pageIns, paths, position) => { console.log('batchAddWatermark', paths); const promises = paths?.map(p => { return addWatermark(pageIns, p, position); }); console.log('promises of add watermark', promises); return Promise.all(promises) }
2025年07月21日
6 阅读
0 评论
0 点赞
2025-05-20
关于vscode remote-ssh远程开发的常见问题
1、VSCode远程连接报错报错信息:Remote host key has changed, port forwarding is disabled could not establish connection to “”:Remote host key has changed, port forwarding is disabled错误原因是原来用VSCode远程过服务器,后来服务器重装了,再用原来的ssh去连接服务器需要重新添加连接信息解决的方法:客户端是windows:是在C:\Users\用户名.ssh上找到known_hosts文件,是隐藏文件,需要先到文件管理器的设置里显示隐藏文件,然后,将里面原来关于该服务器的内容删掉,再重新添加和连接。客户端是Mac:/Users/用户名/.ssh下找到known_hosts文件,将里面原来关于该服务器的内容删掉,再重新添加和连接。2、免密登录初始状态下,每次连接remote都需要手动输入服务器密码来连接,有点麻烦,可以通过配置安全秘钥的方式,让服务器和本地vscode之间自动通过秘钥认证,操作很简单,就是将本地的ssh公钥(一般在~/.ssh目录下的id_rsa.pub文件)复制到服务器的 ~/.ssh/authorized_keys 文件中PS:如果本地还没有ssh文件,通过 ssh-keygen 生成就好
2025年05月20日
38 阅读
0 评论
0 点赞
2025-04-25
three.js中的重要基础概念
Three.js 是一个功能强大的 JavaScript 库,用于创建和展示基于 WebGL 的三维图形。在学习使用Three.js来构建3D世界之前,有一些基本概念是需要牢记的,否则,在你绘制3D世界时,思绪会是杂乱无章的:场景(Scene)定义:场景是所有三维对象的容器,用于存储和管理几何体、光源、相机等元素。作用:场景是渲染的基础,所有需要显示的对象都必须添加到场景中。创建:const scene = new THREE.Scene();相机(Camera)定义:相机定义了从哪个视角观察三维场景。常见类型:透视相机(PerspectiveCamera):模拟人眼透视效果,远处物体看起来更小。const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);正交相机(OrthographicCamera):不考虑透视效果,所有物体大小一致。const camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0.1, 1000);渲染器(Renderer)定义:渲染器负责将场景和相机中的内容绘制到屏幕上。常用渲染器:THREE.WebGLRenderer 是最常用的渲染器。创建:const renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement);几何体(Geometry)定义:几何体定义了物体的形状。常见几何体:BoxGeometry:立方体。SphereGeometry:球体。PlaneGeometry:平面。BufferGeometry:更高效的自定义几何体。创建:const geometry = new THREE.BoxGeometry(1, 1, 1);材质(Material)定义:材质定义了物体的外观属性,如颜色、纹理、反射等。常见材质:MeshBasicMaterial:基础材质,不考虑光照。MeshLambertMaterial:漫反射材质,适合哑光表面。MeshPhongMaterial:高光材质,适合光滑表面。MeshStandardMaterial:基于物理的材质,适合现代渲染效果。创建:const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });网格(Mesh)定义:网格是几何体和材质的组合,用于创建具体的三维物体。创建:const mesh = new THREE.Mesh(geometry, material); scene.add(mesh);光源(Light)定义:光源用于照亮场景中的物体。现实中的一切物体之所以能被看到,都是因为有了光,在three.js 的世界里,亦是如此,需要看到哪个地方,就需要有光线照亮那个地方常见光源:AmbientLight:环境光,均匀照亮整个场景。DirectionalLight:方向光,模拟太阳光。PointLight:点光源,从一点向四周发射光线。SpotLight:聚光灯,模拟手电筒或舞台灯光。创建:const light = new THREE.DirectionalLight(0xffffff, 1); scene.add(light);控制器(Controls)定义:控制器用于控制相机的移动和旋转,实现用户交互。常见控制器:OrbitControls:允许用户通过鼠标或触摸屏旋转、平移和缩放视图。TrackballControls:类似于轨道球的交互方式。使用:const controls = new THREE.OrbitControls(camera, renderer.domElement);加载器(Loader)定义:加载器用于加载外部资源,如模型、纹理、字体等。这个库很重要,没有这个库,所有的东西都需要我们用代码来绘制,这是相当庞大的工作量,而有了这个库,我们就可以加载设计师和建模师做好了的模型,纹理图等内容到场景中,常见加载器:GLTFLoader:加载 GLTF 格式的 3D 模型。TextureLoader:加载图像作为纹理。FontLoader:加载字体文件。使用:const loader = new THREE.TextureLoader(); const texture = loader.load('texture.jpg');动画(Animation)定义:动画用于实现动态效果,如旋转、移动、缩放等。实现方式:使用 requestAnimationFrame 实现循环更新。使用 THREE.AnimationMixer 播放模型动画。示例:function animate() { requestAnimationFrame(animate); mesh.rotation.y += 0.01; renderer.render(scene, camera); } animate();坐标系(Coordinate System)定义:Three.js 使用右手坐标系,X 轴指向右方,Y 轴指向上方,Z 轴指向屏幕外。注意:默认情况下,原点位于场景中心。缓冲区几何体(BufferGeometry)定义:BufferGeometry 是一种高效的数据结构,用于定义复杂的几何体。优点:性能更高,适合大规模数据处理。使用:const geometry = new THREE.BufferGeometry(); const vertices = new Float32Array([ 0, 0, 0, 1, 0, 0, 0, 1, 0 ]); geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3));辅助工具(Helpers)定义:辅助工具用于可视化调试,如网格、轴、光源范围等。常见工具:GridHelper:显示网格。AxesHelper:显示坐标轴。DirectionalLightHelper:显示方向光的方向。雾效(Fog)定义:雾效用于模拟远近物体的模糊效果。使用:scene.fog = new THREE.Fog(0xffffff, 1, 10);
2025年04月25日
17 阅读
0 评论
0 点赞
2025-01-03
好用下电视的网站
记录一些好用,稳定,下电视的网站大米看吧 https://www.dmkanba.com/movie80s http://xiepp.com/ 这个网站从高中老年机看3gp 格式的电视开始就在这里下载了,但是不知道现在为啥总是需要频繁换域名
2025年01月03日
24 阅读
0 评论
0 点赞
2024-12-24
vscode 打开ts文件没有了代码补全和错误提示右下角报错The JS/TS language service immediately crashed 5 times. The service will not be restarted.
更新了vscode的版本到最新版本,突然就不能愉快地编写ts代码了,具体表现为 - 使用对象里面的方法无法提示了 - 方法没有函数注释的提示,没有参数提示了,看不到参数类型和返回值类型了 - 无法 cmd+鼠标左键跳转方法或对象定义
2024年12月24日
136 阅读
0 评论
0 点赞
2024-10-17
npm安装提示‘current user ("nobody") does not have permission to access the dev dir XXX’
npm安装提示‘current user ("nobody") does not have permission to access the dev dir XXX’
2024年10月17日
62 阅读
0 评论
0 点赞
2024-08-21
在线工具箱网站合集
百川工具https://rivers.chaitin.cn/tools/homeCoolTool工具箱https://www.cooltool.app/腾讯实用工具箱https://tool.browser.qq.com/category/data菜鸟工具箱https://www.jyshare.com/即时工具箱https://www.67tool.com/天天工具箱-内含开发常用工具如json处理,json数据生成TS类型声明等https://tooltt.com/#tooltt-life
2024年08月21日
42 阅读
0 评论
0 点赞
2024-02-26
安装npm依赖时报node版本不支持问题解决办法
安装npm依赖时报如下错误[2024-02-26 18:00:32]error webpack-dev-middleware@7.0.0: The engine "node" is incompatible with this module. Expected version ">= 18.12.0". Got "16.15.1" [2024-02-26 18:00:32]error Found incompatible module. [2024-02-26 18:00:32]info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command. [2024-02-26 18:00:32]The command "yarn" exited with 1.手动删除 node_modules 目录并且清空了npm缓存 npm cache clean --force 重新安装还是不行执行以下命令,禁止npm扫描所有包的 engine -> node 选项yarn config set ignore-engines true
2024年02月26日
120 阅读
0 评论
0 点赞
2024-02-26
nginx配置返回文本或json的方法
有些时候请求某些接口的时候需要返回指定的文本字符串或者json字符串,如果逻辑非常简单或者干脆是固定的字符串,那么可以使用nginx快速实现,这样就不用编写程序响应请求了,可以减少服务器资源占用并且响应性能非常快先看返回固定的文本和json,都是在server中配置location拦截即可,配置示例如下:固定文本:location ~ ^/get_text { default_type text/html; return 200 'This is text!'; }固定json:location ~ ^/get_json { default_type application/json; return 200 '{"status":"success","result":"nginx json"}'; }保存后重新载入配置即可生效,注意:default_type必须要添加,否则浏览器会当成不识别的文件进行下载另外也可以简单的根据请求的URL返回不同的字符串,示例如下:location ~ ^/get_text/article/(.*)_(\d+).html$ { default_type text/html; set $s $1; set $d $2; return 200 str:$s$d; }这样可以简单截取url中的字符串,当然也可以用(.*)匹配所有的,实际中根据不同需求定义即可上面的就是一些简单的案例,在服务器环境中对于简单的处理,充分使用nginx可以省去一些编程工作另外补充一下中文显示的问题,因为Linux下采用的是utf-8的字符编码,默认情况下我们的浏览器在服务器没有指定编码或者静态页面没有声明编码的情况下会以GBK的编码去渲染页面,这样默认情况下返回中文的话浏览器用gbk来解析utf-8编码,显然会出现乱码,这时要在nginx location块中主动添加header来输出正确编码,添加内容为: add_header Content-Type 'text/html; charset=utf-8'; 这样浏览器就知道我们使用的是哪种编码了,或者把add_header这行换成 charset utf-8; 也是可以的原文链接:https://www.cnblogs.com/freeweb/p/5944894.html声明:本文内容来源于网络,版权归原作者所有
2024年02月26日
79 阅读
0 评论
0 点赞
2023-12-21
linux常用命令备忘
linux常用命令备忘进程管理相关查看指定名称的应用进程状态ps aux | grep node查看指定端口占用情况netstat -anp | grep 8080 或 lsof -i:80VIM显示行号,预览模式下(如果在编辑模式先按ESC退出编辑模式)输入:set nu跳转到指定行:预览模式下输入 :12 跳转到第 12 行跳转行尾:预览模式下,直接输入 $ 跳转到当前光标所在行行尾跳转行尾:预览模式下,直接输入 ^ (shift+6) 跳转到当前光标所在行行尾nginx 日志查询相关统计指定日志文件下的 ip 数量awk '{ ip_count[$1]++ } END { print length(ip_count) }' /var/log/nginx/access.log打印所有访问ipawk '{ ip_count[$1]++ } END { print "Unique IP Count:", length(ip_count); for (ip in ip_count) print ip }' /var/log/nginx/access.log根据访问 ip 统计 UVawk '{print $1}' access.log|sort | uniq -c | wc -l查询访问量最频繁的 IPawk '{print $1}' access.log|sort | uniq -c |sort -n -k 1 -r|moremacos 相关显示隐藏文件defaults write com.apple.finder AppleShowAllFiles -bool true使用brew启动引用brew services list 打印所有可用服务后使用 brew services start redis-2.6 启动服务,其他服务同理Docker 相关将本地docker镜像导出保存到指定压缩文件docker save -o ~/Documents/my-project.tar my-project:v3将压缩文件的docker镜像导入到本地镜像仓库docker load --input ~/Documents/my-project.tar镜像上传到在线镜像源先将本地镜像生成一个包含完整镜像源地址的tag,docker tag my-project:v3 xxx.dockerhub.com/namespace/my-project:v3然后推送这个tagdocker push xxx.dockerhub.com/namespace/my-project:v3
2023年12月21日
129 阅读
0 评论
1 点赞
1
2
...
6