参加比赛的作品,开发周期一个月,使用了 Wafer2 框架,后台采用腾讯云提供的 Node.js SDK 接入对象存储 API ,前端核心代码实现了类似于图片编辑器的功能,支持图片和文字的移动、旋转、缩放、生成预览图以及编辑状态的保存,动画部分采用 CSS 动画实现小程序中的模态输入框部分使用了自己封装的 InputBox 组件代码已移除 AppId 等敏感信息,可自行添加自己的 AppId 和 AppSecret 以配置后台环境,实现登录测试,详细添加方法见下文「使用方法」,若本地运行可通过修改 app.json 文件中 page 字段的顺序来查看不同页面微信小程序定制需求请联系作者微信:aweawds (注明来意)效果展示      使用方法首先点击右上角 Star ʕ •ᴥ•ʔ获取Demo代码执行 git clone https://github.com/goolhanrry/Weapp-Demo-LemonJournal.git或 点击此处 下载最新版本的代码解压后在微信开发者工具中打开 Weapp-Demo-LemonJournal 文件夹即可如需进行登录测试,还要执行以下步骤准备好自己的 AppId 和 AppSecret(可在微信公众平台注册后获取)在 project.config.json 的 appid 字段中填入 AppId在 /client/utils/util.js 中相应位置填入 AppId 和 AppSecret在微信开发者工具中重新导入整个项目,上传后台代码后编译运行即可核心代码组件的移动、旋转和缩放主要思路是把  标签(对应图片)和  标签(对应文字)封装在同一个自定义组件  中,通过对外暴露的 text 变量是否为空来进行条件渲染,然后绑定 onTouchStart() 、onTouchEnd() 和 onTouchMove() 三个事件来对整个组件的位置、角度、大小、层级以及 “旋转” 和 “移除” 两个按钮的行为进行操作onTouchStart: function (e) {     // 若未选中则直接返回     if (!this.data.selected) {         return     }     switch (e.target.id) {         case 'sticker': {             this.touch_target = e.target.id             this.start_x = e.touches[0].clientX * 2             this.start_y = e.touches[0].clientY * 2             break         }         case 'handle': {             // 隐藏移除按钮             this.setData({                 hideRemove: true             })             this.touch_target = e.target.id             this.start_x = e.touches[0].clientX * 2             this.start_y = e.touches[0].clientY * 2             this.sticker_center_x = this.data.stickerCenterX;             this.sticker_center_y = this.data.stickerCenterY;             this.remove_center_x = this.data.removeCenterX;             this.remove_center_y = this.data.removeCenterY;             this.handle_center_x = this.data.handleCenterX;             this.handle_center_y = this.data.handleCenterY;             this.scale = this.data.scale;             this.rotate = this.data.rotate;             break         }     } }, onTouchEnd: function (e) {     this.active()     this.touch_target = ''     // 显示移除按钮     this.setData({         removeCenterX: 2 * this.data.stickerCenterX - this.data.handleCenterX,         removeCenterY: 2 * this.data.stickerCenterY - this.data.handleCenterY,         hideRemove: false     })     // 若点击移除按钮则触发移除事件,否则触发刷新数据事件     if (e.target.id === 'remove') {         this.triggerEvent('removeSticker', this.data.sticker_id)     } else {         this.triggerEvent('refreshData', this.data)     } }, onTouchMove: function (e) {     // 若无选中目标则返回     if (!this.touch_target) {         return     }     var current_x = e.touches[0].clientX * 2     var current_y = e.touches[0].clientY * 2     var diff_x = current_x - this.start_x     var diff_y = current_y - this.start_y     switch (e.target.id) {         case 'sticker': {             // 拖动组件则所有控件同时移动             this.setData({                 stickerCenterX: this.data.stickerCenterX   diff_x,                 stickerCenterY: this.data.stickerCenterY   diff_y,                 removeCenterX: this.data.removeCenterX   diff_x,                 removeCenterY: this.data.removeCenterY   diff_y,                 handleCenterX: this.data.handleCenterX   diff_x,                 handleCenterY: this.data.handleCenterY   diff_y             })             break         }         case 'handle': {             // 拖动操作按钮则原地旋转缩放             this.setData({                 handleCenterX: this.data.handleCenterX   diff_x,                 handleCenterY: this.data.handleCenterY   diff_y             })             var diff_x_before = this.handle_center_x - this.sticker_center_x;             var diff_y_before = this.handle_center_y - this.sticker_center_y;             var diff_x_after = this.data.handleCenterX - this.sticker_center_x;             var diff_y_after = this.data.handleCenterY - this.sticker_center_y;             var distance_before = Math.sqrt(diff_x_before * diff_x_before   diff_y_before * diff_y_before);             var distance_after = Math.sqrt(diff_x_after * diff_x_after   diff_y_after * diff_y_after);             var angle_before = Math.atan2(diff_y_before, diff_x_before) / Math.PI * 180;             var angle_after = Math.atan2(diff_y_after, diff_x_after) / Math.PI * 180;             this.setData({                 scale: distance_after / distance_before * this.scale,                 rotate: angle_after - angle_before   this.rotate             })             break         }     }     this.start_x = current_x;     this.start_y = current_y; }编辑状态的保存一篇手帐包含的组件类型包括 sticker(软件自带的贴纸)、image(用户上传的图片)和 text(自定义文字)三种,全部保存在一个如下格式的 json 对象中,每个独立组件都包含了一个不重复的 id 以及相关的信息,保存时由客户端生成该对象并编码成 json 字符串存储在数据库,恢复编辑状态时通过解析 json 字符串获得对象,再由编辑页面渲染{     "backgroundId": "5",                                        背景图id     "assemblies": [         {             "id": "jhjg",                                       组件id             "component_type": "image",                          组件类型(自定义图片)             "image_url": "https://example.com/jhjg.png",        图片地址             "stickerCenterX": 269,                              中心横坐标             "stickerCenterY": 664,                              中心纵坐标             "scale": 1.7123667831396403,                        缩放比例             "rotate": -3.0127875041833434,                      旋转角度             "wh_scale": 1,                                      图片宽高比             "z_index": 19                                       组件层级         },         {             "id": "gs47",             "component_type": "text",                           组件类型(文字)             "text": "test",                                     文字内容             "stickerCenterX": 479,             "stickerCenterY": 546,             "scale": 1.808535318980528,             "rotate": 29.11614626607893,             "z_index": 10         },         {             "id": "chjn",             "component_type": "sticker",                        组件类型(贴纸)             "sticker_type": "food",                             贴纸类型             "sticker_id": "1",                                  贴纸id             "image_url": "https://example.com/weapp/stickers/food/1.png",             "stickerCenterX": 277,             "stickerCenterY": 260,             "scale": 1.3984276885130673,             "rotate": -16.620756913892055,             "z_index": 5         }     ] }
2025-08-09 09:39:27 6.81MB 开源项目
1
% 此脚本根据 24 小时全球太阳辐射计算峰值太阳时% 数据以 .csv 格式保存。 % 数据从第 7 行开始以 2 列格式准备。 % 第 1 列是日期/时间,第 2 列是以 w/m^2 为单位的全球太阳辐射数据% 给定日期的 24 小时数据从 0 小时到 23 小时开始。 % 每小时采样数据有 24 个数据点或 1440 个数据点每分钟采样数据的百分比。 % 第 1 列和第 1 至 6 行是气象站信息。 % 请参阅示例 .csv 文件以了解如何准备数据。
2025-08-02 17:25:48 7KB matlab
1
昆仑通态掉电保存程序, 、
2025-07-29 11:11:37 302KB 昆仑通态
1
Qt 如何读取编辑保存显示 MarkDown文件-附件资源
2025-07-21 00:38:31 106B
1
什么是格威迪翁? “Gwyddion 是一个用于 SPM(扫描探针显微镜)数据可视化和分析的模块化程序。主要用于分析通过扫描探针显微镜技术(AFM、MFM、STM、SNOM/NSOM)获得的高度场”( http:// gwyddion.net/ ) saveasgsf 以 Gwyddion 简单字段文件格式 (.gsf)(仅一个通道)保存 NxM 矩阵 saveasgwy 以 Gwyddion 原生文件格式 (.gwy) 保存 NxM 或 NxMxL 矩阵 函数调用: saveasgsf(文件名,数据,numstepsx,numstepsy,startx,endx,starty,endy,标签,单位,时间,varargin) 或者saveasgwy(文件名,数据,numstepsx,numstepsy,startx,endx,starty,endy,标签,单位,时间,可变参数) 例子:
2025-07-14 20:23:21 555KB matlab
1
MobaXterm V24.4 免费版对会话有限制,保存14个以后就不能再保存,对于我们开发要连接好多服务器的话,就比较头疼了,所以我提供的这个文件直接就可以解决。 使用方式:下载文件后,直接放在MobaXterm的安装目录下,重启MobaXterm就可以不限制用户保存session连接了。 MobaXterm是一款功能强大的网络工具,它将终端、X服务器、网络工具和其他实用功能集成在一个单一的Windows应用程序中,为用户提供了一种便捷的方式来进行远程任务的管理和脚本的执行。它支持多种协议,包括SSH、RDP、VNC、FTP、SFTP等,使得用户可以在一个统一的界面中管理不同的网络会话和数据传输任务。 然而,MobaXterm的免费版本由于受到版权的限制,在保存会话(session)方面存在一定的局限性。具体来说,在MobaXterm V24.4免费版中,用户仅能保存有限数量的会话连接。这一限制对于需要频繁连接多个服务器的开发者或系统管理员而言,确实是一个不小的问题。会话保存数量的限制会影响工作效率,因为每次重启或重新连接后,他们都需要重新建立和配置之前的会话,这无疑增加了重复劳动并可能导致配置错误。 为了解决这一问题,提供了相关的文件解决方案。用户只需要下载该文件,并将其放置于MobaXterm的安装目录中,之后重启MobaXterm程序,就可以突破之前的限制,实现对更多会话连接的保存。这样,用户就可以不受会话数量的限制,随心所欲地管理他们与各种服务器的连接。这一改动不仅提高了工作效率,也让用户体验更加流畅。 然而,用户在使用这种方法解决会话保存限制时也需要注意几点:用户应确保他们使用的是合法的MobaXterm版本,避免使用破解或非法修改版本,这可能会对他们的系统安全带来风险。用户需要确认修改文件的来源是可靠的,因为错误或恶意的文件修改可能会对MobaXterm的正常功能造成影响,甚至可能对用户的计算机安全构成威胁。用户应当谨慎操作,根据官方提供的指导或经验丰富的专业人士的建议来进行文件的替换和设置。 MobaXterm V24.4版本的这一突破性更新,极大地提升了用户进行远程开发、系统管理以及网络任务处理时的便捷性和效率。对于依赖MobaXterm工具的专业人员来说,这无疑是一个利好消息,使得他们能够更加专注于核心的工作任务,而不必担心会话保存的限制问题。 通过使用这种方法来绕过MobaXterm的会话保存限制,用户可以更好地管理多服务器环境,优化他们的工作效率。然而,用户应始终确保操作的安全性和合法性,以避免可能的风险和后果。
2025-07-14 17:47:15 276B MobaXterm
1
JAVA保存计算过程的计算器课程设计报告.doc
2025-07-06 21:38:55 148KB
1
其中具体流程为刷两次指纹图像,然后保存指纹图像,然后按下进入验证指纹状态,然后按刷指纹的按键,正确的话蜂鸣器会响,不正确的话蜂鸣器会不响。同时还有相关的指示灯。FPGA实现,vivado工程,同时适配quartus,把里面的代码直接导进quartus就可以直接用。 基于FPGA实现的指纹密码锁系统是一项应用在门禁安全领域的技术,它结合了指纹识别技术和现场可编程门阵列(FPGA)的高速处理能力,提供了更为安全和便捷的身份验证方式。在本项目中,使用AS608作为指纹识别模块,这个模块是广泛应用于指纹识别技术的一个组件,因其性能稳定、识别精度高而被多数指纹密码锁产品所采纳。 该系统设计包含三个主要的物理按键,分别用于不同阶段的操作:首先是读取手指图像按键,用于触发指纹模块进行指纹图像的采集;其次是保存按键,用于将采集到的指纹图像数据保存至存储单元中,为后续的验证提供数据基础;最后是进入验证指纹状态按键,用于激活指纹密码锁的验证功能。 整个使用流程包括以下步骤:首先用户需要两次刷取指纹图像,系统将对这两次采集的图像进行比对,确认一致后进行保存。在指纹图像保存之后,用户可以按下进入验证指纹状态的按键,此时系统进入指纹验证模式。当用户再次将手指放在指纹识别模块上进行验证时,系统会比对先前保存的指纹图像与当前读取的图像是否匹配。如果验证成功,系统会通过蜂鸣器发出响声作为成功提示,并可能通过指示灯显示相应的状态;如果验证失败,则蜂鸣器保持不响,指示灯也显示出不同的状态。 本项目使用了Xilinx公司的vivado软件进行FPGA的工程设计和开发,vivado是一个强大的FPGA设计套件,支持从设计到硬件实现的完整流程。此外,为了增加适用性和兼容性,该项目还适配了Altera(现为Intel FPGA的一部分)公司的quartus软件。quartus是Altera公司推出的另一种FPGA设计工具,它同样支持从设计到硬件实现的全过程。开发者可以在vivado环境下完成设计后,将代码直接导入到quartus中进行使用和进一步的开发。这种跨平台的代码兼容性设计为开发者提供了极大的便利,使得项目可以在不同的硬件平台上灵活应用。 在实际应用中,这种基于FPGA的指纹密码锁系统能够提供快速、准确的验证,同时由于FPGA的可编程特性,系统还可以进行升级和功能拓展,满足不同场景下的安全需求。此外,FPGA相比于传统微控制器的运行速度快,稳定性高,功耗低,非常适合于需要快速响应和高可靠性的安全系统。 对于希望将此项目应用于自己板卡的开发者而言,需要针对自己使用的具体硬件板卡进行引脚配置,以确保系统能够正确运行。这通常涉及到查阅硬件手册,了解各个引脚的功能,以及如何将FPGA的输入输出与指纹模块和其他外部设备如蜂鸣器、指示灯等相连接。 本项目展示了一种创新的安全技术应用,结合了FPGA的高性能和指纹识别模块的精确性,提供了可靠的身份验证解决方案。通过对项目的深入理解和操作,开发者不仅能够学会如何设计和实现一个基于FPGA的指纹密码锁,还能够掌握跨平台设计工具的使用方法,为未来在安全系统的开发和创新打下坚实的基础。
2025-06-28 23:30:40 28.13MB FPGA 指纹密码锁 AS608
1
"txt2wav:TTS 文本朗读并保存为WAVE音频文件的示例" "在 Delphi 开发环境中,我们经常需要处理文本转换语音(TTS,Text-to-Speech)的任务,例如将文本信息转化为可听的音频文件。'txt2wav' 是一个这样的示例程序,它演示了如何利用 Delphi 的 TTS 技术,将输入的文本转化为WAVE格式的音频文件。这个程序对于那些需要创建有声读物、辅助视觉障碍者或者自动化语音反馈系统的人来说非常有用。" 【核心知识点】 1. **TTS (Text-to-Speech)**:TTS 是一种计算机技术,允许软件将文本转换为可听见的语音输出。它通过合成技术模拟人类的发音,使得计算机能够读出文本内容。在 Delphi 中,可以使用第三方库或内置组件来实现TTS功能。 2. **Delphi**: Delphi 是一个基于 Object Pascal 语言的集成开发环境(IDE),由 Embarcadero Technologies 开发,用于创建 Windows 和 macOS 平台上的桌面应用程序。它拥有强大的组件库,适合快速开发。 3. **WAVE 文件格式**:WAV(Waveform Audio File Format)是由微软和IBM共同开发的一种音频文件格式,以无损的方式存储音频数据,广泛支持各种操作系统和音频处理软件。WAV 文件通常用于高质量的音频记录和编辑,但文件体积较大。 4. **音频文件生成**:在 Delphi 中,开发者可以使用特定的组件或库,如 `SpeechLib` 或 `Indy`,来实现将 TTS 输出的音频流保存为 WAV 文件。这个过程包括创建 TTS 对象,设置语音属性(如语速、音调等),将文本转化为音频流,然后将这个流写入到 WAV 文件中。 5. **示例程序结构**:"txt2wav" 示例程序可能包含以下部分: - 用户界面:用于输入文本和设置 TTS 参数(如语音类型、速度等)。 - TTS 引擎接口:与 TTS 库进行交互,创建和配置 TTS 对象。 - 音频输出模块:将生成的音频流保存为 WAV 文件。 - 错误处理和日志记录:确保程序的稳定性和可追踪性。 6. **TTS 参数调整**:TTS 系统通常允许开发者或用户调整各种参数,如语速、音量、语调、节奏,以及选择不同的发音人,以适应不同的应用场景。 7. **兼容性和跨平台**:虽然 Delphi 原生支持 Windows,但通过第三方库,如 FPC/Lazarus 或 FireMonkey,也可以实现跨平台的 TTS 功能,使得 "txt2wav" 类似的应用能在其他操作系统上运行。 8. **应用领域**:TTS 技术广泛应用于自动客服系统、有声读物、车载导航、移动设备、教育软件以及无障碍设施等领域,为用户提供便捷的语音服务。 9. **代码实现**:在 Delphi 中,TTS 转换通常涉及创建 TTS 对象,设置其属性,调用 Speak 方法读出文本,然后使用音频处理函数将音频流保存到 WAV 文件。例如: ```delphi var SpVoice: Variant; WaveFile: TFileStream; begin // 初始化 TTS 对象 SpVoice := CreateOleObject('SAPI.SpVoice'); // 设置语音属性 SpVoice.Rate := 0; // 语速 // 将文本转化为语音 SpVoice.Speak('你好,这是一个TTS示例', SVSFDefault); // 创建 WAV 文件流 WaveFile := TFileStream.Create('output.wav', fmCreate); // 保存音频流到 WAV 文件 // ... end; ``` 总结来说,"txt2wav" 是一个 Delphi 开发的 TTS 示例,它展示了如何将文本转换成WAV音频文件,为开发者提供了在自己的项目中实现类似功能的参考。通过理解和掌握这些核心知识点,开发者可以更高效地利用 TTS 技术来增强应用的功能和用户体验。
2025-06-28 07:13:41 7KB delphi wave
1
Qt步进电机上位机控制程序:基于Qt框架的C++源码,支持串口、TCP/UDP网络三种端口类型,自动保存配置,超时提醒,模块化设计,详细注释与人工讲解,部署简易。,Qt步进电机上位机程序:跨平台C++控制源码,支持串口、TCP/UDP网络,注释详尽,配置自动保存,超时提醒,源码包含设计文档,Qt步进电机上位机控制程序源代码Qt跨平台C C++语言编写 支持串口Tcp网口Udp网络三种端口类型 提供,提供详细注释和人工讲解 1.功能介绍: 可控制步进电机的上位机程序源代码,基于Qt库,采用C C++语言编写。 支持串口、Tcp网口、Udp网络三种端口类型,带有调试显示窗口,接收数据可实时显示。 带有配置自动保存功能,用户的配置数据会自动存储,带有超时提醒功能,如果不回复则弹框提示。 其中三个端口,采用了类的继承与派生方式编写,对外统一接口,实现多态功能,具备较强的移植性。 2.环境说明: 开发环境是Qt5.10.1,使用Qt自带的QSerialPort,使用网络的Socket编程。 源代码中包含详细注释,使用说明,设计文档等。 请将源码放到纯英文路径下再编译。 3.使用介绍: 可直接运行
2025-06-19 11:05:31 13.45MB css3
1