微信小程序使用wx.chooseImage上传图片时进行压缩,并添加时间水印

微信小程序上传图片添加水印 微信小程序使用wx.chooseMedia拍摄或从手机相册中选择图片并添加水印, 阅读详情

在微信小程序的开发过程,经常会使用自带的api(wx.chooseImage)进行图片拍照或选择图片进行上传,有时图片太大,造成上传和下载时过慢,现对图片进行压缩后上传,以下是流程和代码

一、小程序的版本选择了3.2.5,使用其它版本有时不知道错误

二、wxml代码,需要添加canvas

<canvas style="width: {{cwidth}}px;height: {{cheight}}px;position:fixed;top:9999px" canvas-id="mycanvas"></canvas>

三、js代码

1、参数

 cwidth:'375',

cheight:'667',

   //上传图片时,当前数组下标,用来确认上传第几张图片,上传完一次就+1

        tempNum: 0,

        // 图片上传参数 

        filePath: "",

        images: [],

        count: 1,

2、选择图片wx.chooseImage
 

// 选择图片
    chooseImage: function (e) {
        console.log('选择图片chooseImage')
        var that = this;
        wx.chooseImage({
            count: that.data.count, // 默认9
            sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有
            sourceType: ['camera'], // 可以指定来源是相册还是相机,默认二者都有
            success: function (res) {
                console.log('图片大小='+res.tempFiles[0].size)
                that.addTimeWatermark(res.tempFilePaths[0])

            },
        })
    },

// 添加时间水印
    addTimeWatermark: function (imagePath) {
        var that = this
        console.log('addTimeWatermark=' + imagePath)
        var ctx = wx.createCanvasContext('mycanvas');
        this.roundRectColor(ctx, 0, 0, 375, 667, 16);
        ctx.drawImage(imagePath, 15, 120, 344, 400);
        ctx.save();
        // 设置水印文字
        const time = app.util.formatTime()
        console.log('time=' + time)
        ctx.beginPath(); //开始绘制   
        ctx.setFontSize(22);
        ctx.setFillStyle('#DC3545')
        ctx.fillText(time, 15, 450); // 根据实际情况调整位置
        ctx.draw();
        //将生成好的图片保存到本地,需要延迟一会,绘制期间耗时
        setTimeout(function () {
            wx.canvasToTempFilePath({
                canvasId: 'mycanvas',
                success: function (res) {
                    var tempFilePath = res.tempFilePath;
                    that.canvasImage(tempFilePath, 0) 
                },
                fail: function (res) {
                    console.log(res);
                }
            });
        }, 200);

    },
    roundRectColor: function (context, x, y, w, h, r) { //绘制圆角矩形(纯色填充)
        context.save();
        context.setFillStyle("#FFFFFF"); //小框
        context.setStrokeStyle('#FFFFFF') //大框
        // context.setLineJoin('round'); //交点设置成圆角
        context.setLineWidth(r);
        context.strokeRect(x + r / 2, y + r / 2, w - r, h - r);
        context.fillRect(x + r, y + r, w - r * 2, h - r);
        context.stroke();
        context.closePath();
    },
//压缩图片1(加了水印后压缩)
    canvasImage:function(imgUrl,index){
        console.log('canvasImage111压缩图片')
       wx.showLoading({
           title: '照片上传中...',
         })
       var that = this
       wx.getImageInfo({
           src: imgUrl,
           success(res) {
               console.log("路径", res.path)
               console.log('获得原始图片大小', res.width, res.height)
               var originWidth, originHeight;
               originHeight = res.height;
               originWidth = res.width;
               // 最大尺寸限制   //压缩比例
               var maxWidth = originWidth >= originHeight ? 540 : 810,
                   maxHeight = originWidth >= originHeight ? 810 : 540;
               // 目标尺寸
               var targetWidth = originWidth,
                   targetHeight = originHeight;
               //等比例压缩,如果宽度大于高度,则宽度优先,否则高度优先
               if (originWidth > maxWidth || originHeight > maxHeight) {
                   if (originWidth / originHeight > maxWidth / maxHeight) {
                       // 要求宽度*(原生图片比例)=新图片尺寸
                       targetWidth = maxWidth;
                       targetHeight = Math.round(maxWidth * (originHeight / originWidth));
                   } else {
                       targetHeight = maxHeight;
                       targetWidth = Math.round(maxHeight * (originWidth / originHeight));
                   }
               }
               console.log("压缩后的图片大小", targetWidth, targetHeight)
               var ctx = wx.createCanvasContext('mycanvas');
               ctx.clearRect(0, 0, targetWidth, targetHeight);
               ctx.drawImage(res.path, 0, 0, targetWidth, targetHeight);
               ctx.draw();
               //更新canvas大小
               that.setData({
                   cwidth: targetWidth,
                   cheight: targetHeight
               });
               setTimeout(function () {
                   wx.canvasToTempFilePath({
                       canvasId: 'mycanvas',
                       fileType: 'jpg', // 指定输出格式为JPG
                       quality:0.5,//压缩比,必需设置输出格式为JPG才能有效
                       success: (res) => {
                           wx.hideLoading()
                           console.log("压缩后的临时路径:", res.tempFilePath)                          
                            that.data.images.push(res.tempFilePath);
                            console.log(that.data.images)
                            that.setData({
                                imagePath: res.tempFilePath,
                                images: that.data.images
                            });
                       },
                       fail: (err) => {
                           wx.hideLoading()
                           console.error(err)
                       }
                   }, this)
               }, 400); //延迟400毫秒为了等canvas画上
           }
       })
   },  

//上传图片
app.util.uploadImg(that.callBackClose, app, that.data.pid, that.data.images, that.data.tempNum, 'check')

微信小程序图片压缩上传实战:从wx.compressImage到完整方案 图片压缩是前端性能优化和成本控制中的关键技术,其核心原理是通过算法减少图片文件的体积,在视觉质量可接受的范围内,用计算资源换取网络与存储资源。这项技术对于提升用户体验、降低服务器带宽与CDN成本具有重要价值,广泛应用于用户头像上传、内容分享、商品展示等需要处理图片上传的场景。本文聚焦于微信小程序生态,深入解析如何利用官方API wx.compressImage,并结合wx.uploadFile,构建一个包含图片选择、客户端压缩、预览反馈及上传服务器的完整、健壮的图片处理流程。文中将详细探讨压缩参数quali 阅读详情

相关推荐

微信小程序开发中的图片选择与上传

微信小程序开发中,图片选择与上传是常见的功能需求之一。本文将详细介绍如何实现图片选择与上传的功能,并提供相应的代码示例。可以使用该方法实现图片上传功能。以上就是关于微信小程序中图片选择与上传功能的详细介绍和代码示例。选择图片成功后,会返回一个包含选定照片的本地文件路径列表,可以将其中的路径设置为。图片上传的实现方式有多种,可以使用微信小程序提供的。参数指定了服务器定义的文件对应的 key,参数指定了选择图片的来源(相册或相机)。参数指定了最多可以选择的图片数量,参数指定了要上传文件资源的路径,

qq_67153941的博客 1401

H5使用微信JSSDK的wx.chooseImage进行多文件上传

h5使用微信sdk解决在微信浏览器内核不能多图片上传的方法

javascript和jq设置金额整数与小数点后面的字体大小 6464

微信小程序自定义拍照界面开发指南:从camera组件到高级功能实现

在移动应用开发中,图像采集是常见的功能需求,其核心在于如何高效、灵活地调用设备摄像头并处理图像数据。从技术原理上讲,开发者通常需要理解原生组件与API调用的区别,前者提供底层控制能力,后者则封装了通用流程。自定义拍照界面的技术价值在于能够突破系统默认界面的限制,实现与产品设计语言的高度统一,并支持复杂的业务逻辑嵌入,如实时滤镜、人脸识别和多角度采集。在应用场景上,这尤其适用于证件照拍摄、AR试妆、商品展示等对交互流程和视觉效果有特定要求的领域。本文聚焦于微信小程序平台,深入解析如何基于camera组件构建高

weixin_34094282的博客 369

一文彻底弄懂wx.chooseImage

最近在做一个复杂的跨五端(PC、H5、小程序、iOS、android)的需求,历时将近两个多月,其中酸甜苦辣冷暖自知,近日终于可以封板上线,回忆整个开发过程,深坑不断,收获颇多,今天先分享一下在微信小程序的web-view里选取照片的功能,此文完整的记录整个开发过程,彻底解决各种疑难杂症。 深度调研 因为跨端所以最开始使用了<input type="file" accept="image...

weixin_34194379的博客 1万+

微信小程序图片安全审核实战:腾讯云IMS集成与合规部署指南

内容安全审核是互联网应用,特别是涉及用户生成内容(UGC)平台的基础技术保障。其核心原理是通过机器学习和图像识别技术,对文本、图片、音视频等内容进行多维度检测,识别色情、暴恐、政治敏感、广告等违规信息。这项技术的价值在于,它能自动化、规模化地过滤风险内容,是平台合规运营、规避法律风险、维护社区健康生态的关键防线。在微信小程序、社交应用、电商平台等场景中,内容安全审核更是保障应用顺利上线和稳定运行的“生死线”。本文聚焦于微信小程序生态,深入解析如何集成腾讯云图片内容安全(IMS)服务,从接口选型、服务端部署、

weixin_33896726的博客 512

微信小程序:chooseimage从本地相册选择图片或使用相机拍照

【代码】微信小程序:chooseimage从本地相册选择图片或使用相机拍照。

彭世瑜的博客 1995

微信小程序--上传图片加水印

微信小程序–上传图片加水印 ChooseImage() { var _this = this wx.chooseImage({ count: 1, //默认9 sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有 sourceType: ['album'], //从相册选择 success: (res) => { // 返回选定照片的本地文件路径列表,tempFilePath js //选择图...

yynikki的博客 5134

微信小程序集成百度AI图像识别实战:人脸颜值+植物识别双通道

图像识别是人工智能落地移动端的核心能力之一,其本质是通过深度学习模型对输入图像进行特征提取与分类判别。在微信小程序生态中,受限于网络策略与安全规范,直接调用第三方AI接口不可行,必须借助云函数实现鉴权中转与token自动管理。该方案兼顾技术安全性(client_secret不暴露)、工程稳定性(access_token缓存续期)和用户体验(图片压缩+缩略图自适应),广泛适用于校园科普、美颜社交、本地生活等场景。本文聚焦微信小程序与百度AI平台的深度适配,详解人脸颜值分析与植物识别双通道选型逻辑及端云协同实现

weixin_34294649的博客 500

微信小程序图片添加水印并等比列缩放

index.wxml <view class="message-page"> <view> <canvas canvas-id="firstCanvas" class="canvas" bindtap="getCanvasImage"></canvas> <button bindtap="chooseImage" cla...

...... 1340

微信小相册小程序源码:含可运行前端页面与Node.js后端服务

这个资源包提供一套完整的微信小相册小程序实现,前端包含app.js、app.、app.wxss及pages目录下的所有页面逻辑与WXML结构,支持图片浏览、上传、列表展示等基础功能;images目录内置示例图,screenshot.png直观呈现界面效果。后端基于Node.js开发,server目录下划分routes(路由)、middlewares(中间件)、services(业务逻辑)、models(数据模型)等模块,配合config.js和globals.js统一管理环境配置与全局变量。common目录

time3的博客 262

微信小程序云开发实战:从零构建全栈失物招领应用

云开发是一种集成了数据库、存储和云函数等后端能力的Serverless解决方案,它让开发者无需管理服务器即可构建全栈应用。其核心原理是通过提供封装好的云端服务,将复杂的后端运维工作简化,使开发者能专注于业务逻辑。这项技术的价值在于极大地降低了全栈开发的门槛,提升了开发效率,尤其适合快速构建和验证轻量级应用。在应用场景上,云开发广泛适用于内容管理、社交互动、工具类小程序等需要快速上线和迭代的项目。本文以“失物招领”小程序为例,详细展示了如何利用云开发的云数据库进行数据结构设计,并通过云函数实现安全的业务逻辑,

weixin_34268753的博客 780

微信小程序拍照加水印

1.wxml代码: 因为拍照要到指定位置显示,这里的canvas我就是隐藏了,需要显示的可以改css:display: block; <canvas style="width: {{thumbWidth}}px; height: {{thumbHeight}}px;display: none;" canvas-id="firstCanvas"></canvas> 2.js部分: ...

好记性不如烂笔头 3792

利用HTML+CSS设计PPT:html-to-pptx实现自动化转换与可编辑输出

在办公自动化和前端开发领域,将网页技术应用于文档生成是一个重要的技术方向。其核心原理在于通过解析HTML/CSS的结构与样式,将其映射为目标文档的原生对象模型。这项技术的价值在于,它能够将Web技术栈强大的布局与样式能力(如Flexbox、CSS Grid)与办公软件(如Microsoft PowerPoint)的广泛兼容性和可编辑性相结合。在实际应用场景中,这种技术特别适合需要快速生成兼具设计感与实用性的演示文稿,例如数据报告、产品发布和营销材料。本文探讨的html-to-pptx项目正是这一思路的工程实

weixin_30652491的博客 486

跟我一起,利用bitcms内容管理系统从0到1学习小程序开发:三、上传图片到服务器...

上一篇跟我一起,利用bitcms内容管理系统从0到1学习小程序开发:二、与服务端通信,Hello bitcms!被园子管理员人从首页撤下,理由是“原创精品,排版整齐,有足够的篇幅,与程序员相关,能够让读者从中学到知识”,经过认真深刻的反省,文章确实存在很多问题。 1、排版不够认真。周五下班前匆匆赶稿,只对内容进行简单的加粗换行。就勿勿发表了,确实排版不够精细。 2、原创必须的,但不够...

aishi5825的博客 278

(学习笔记)机器人自主导航从零开始第四步———Rviz、Gazebo、Meshlab的安装

一、Rviz的安装 Rviz是一个

qq_59475883的博客 5057

深度学习简介(框架)

深度学习是一种基于人工神经网络的机器学习方法,它通过模拟人脑的工作原理来解决复杂的数据模式识别问题。这种方法在图像识别、语音识别、自然语言处理等领域取得了显著的进展。深度学习是机器学习的一个子领域,它基于人工神经网络的学习算法,特别是那些具有多层(深层)结构的网络。这些深度神经网络能够学习数据的高级特征和模式。深度学习作为人工智能的关键驱动技术,已经在多个领域展现出其强大的能力。随着研究的深入和技术的发展,深度学习将继续推动人工智能的边界向前发展。

2301_77539454的博客 5351

小程序OSS图片上传

图片上传加水印问题,代码如下! chooseImage: function (e) { var that = this; wx.chooseImage({ sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 sourceType: ['album', 'camera'], /...

weixin_33742618的博客 286

二阶系统的带宽(频域分析)

下面以典型I型系统为例,计算系统的开环截止频率和闭环截止频率。设I型系统为: 1:系统的开环截止频率为 2:系统的闭环截止频率 其实我们在工程整定时,把ζ = 0.707,也把系统的带宽近视看成自然震荡角频率即 (wb≈wc≈wnw_{b}\approx w_{c}\approx w_{n}wb​≈wc​≈wn​)对于二阶系统。 ...

wanrenqi的博客 2万+

高效实现微信小程序图片裁剪:image-cropper插件实战指南

在微信小程序开发中,图片裁剪功能是用户头像上传、商品图片编辑等场景的核心需求。image-cropper作为一款专为微信小程序设计的高性能图片裁剪插件,凭借其流畅的交互体验和丰富的配置选项,成为开发者处理图片裁剪任务的理想选择。本文将深入解析image-cropper的核心特性、集成方法和最佳实践,帮助开发者快速掌握这款专业工具的使用技巧。 ## 核心特性解析:为什么选择image-croppe

gitblog_01191的博客 417

1分钟了解LangChain是什么?

是一个基于大型语言模型(LLM)开发应用程序的框架, 它旨在简化语言模型应用的开发流程,特别是在构建对话系统和其他基于语言的AI解决方案时.目标是将复杂的语言模型技术转化为可通过简单API调用实现的功能,从而使开发者能够更加专注于创造性的解决方案设计。高效地解决了开发大语言模型应用的痛点问题。Langchain 最主要的特色是可以将 LLM 应用研发过程中的交互 Prompt、LLM 模型调用、语言模型与环境互动的自适应等方式融为一体。

gorgor在码农 2630

sphincs+ Nist Round3文档中文译版(SPHINCS+ Submission to the NIST post-quantum project, v.3)

1. 引言 哈希基础签名方案最初是由Lamport [14]在1970年代后期作为一次性签名方案开发的,并由Merkle [16]扩展为多次签名方案。这些方案的安全性易于分析,并仅依赖于所使用的哈希函数的属性。然而,Merkle基于树的签名方案需要在密钥生成时就确定要进行签名的数量,且为了保持性能这个数字要小。最重要的是,该系统需要用户记住一个状态:这个状态包含一些信息以记住密钥已经进行了多少次签名。 在Lamport方案诞生后的40年里,产生了许多想法改进了哈希基础签名的性能、实用性和理论基础,最终XMS

dedanddwb的博客 394

uni-file-picker跨端文件上传组件:从原理到实战的完整指南

在跨平台应用开发中,文件上传是一个常见且复杂的需求,涉及前端交互、平台差异处理和网络传输等多个环节。其核心原理在于通过统一的API抽象层来抹平不同操作系统和运行环境(如H5、小程序、App)的底层差异,实现一次开发、多端部署。这种设计为开发者带来了显著的技术价值:它极大地提升了开发效率,降低了维护成本,并保证了用户体验的一致性。在实际工程实践中,文件上传组件通常需要处理图片压缩、多文件并发控制、临时文件管理以及与后端API的对接等具体问题。uni-file-picker作为uni-app生态中的官方组件,正

chulilang8944的博客 492

【微信小程序-uniapp】CustomPicker 自定义单项选择器组件

自定义底部弹出框单项选择器组件,适用于uniapp小程序

Komorebi_00的博客 1532

微信小程序视频封面获取:从API兼容到服务端生成的完整方案

在移动应用开发中,处理多媒体文件是常见的需求,其中视频封面图的获取直接影响用户体验。其核心原理涉及文件解码、帧提取与图像处理。稳定的封面生成技术对提升内容展示质量和应用专业性具有重要价值,广泛应用于社交分享、内容社区等需要预览视频内容的场景。本文针对微信小程序开发中的实际痛点,深入剖析了 `wx.chooseMedia` API在返回 `thumbTempFilePath` 时存在的**兼容性陷阱**,并提供了通过 `wx.createVideoContext` 截帧的客户端备选方案。然而,为彻底解决黑帧、

ciya3282的博客 426

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: fastadmin添加管理员账号只能查看一个表中指定条件的数据
下一篇: php接入DeepSeek api对话
bilichen006
博客等级 码龄12年 93粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值