[猫头虎分享21天微信小程序基础入门教程] 第20天:小程序的多媒体功能与图像处理

[猫头虎分享21天微信小程序基础入门教程] 第20天:小程序的多媒体功能与图像处理
请添加图片描述


第20天:小程序的多媒体功能与图像处理 🎨

自我介绍

大家好,我是猫头虎,一名全栈软件工程师。今天我们继续微信小程序的学习,重点了解小程序的多媒体功能与图像处理。这些功能可以帮助你在小程序中实现丰富的多媒体交互,提高用户体验。🚀

多媒体功能

一、拍照与录像

微信小程序提供了 wx.chooseImagewx.chooseVideo API,方便用户拍照和录像。

1. 拍照

wxml 文件:

<view class="container">
  <button bindtap="takePhoto">拍照</button>
  <image src="{{photoPath}}" mode="widthFix"/>
</view>

js 文件:

Page({
  data: {
    photoPath: ''
  },
  takePhoto() {
    wx.chooseImage({
      count: 1,
      sizeType: ['original', 'compressed'],
      sourceType: ['camera'],
      success: (res) => {
        this.setData({
          photoPath: res.tempFilePaths[0]
        });
      },
      fail: (err) => {
        console.error('拍照失败:', err);
      }
    });
  }
});
2. 录像

wxml 文件:

<view class="container">
  <button bindtap="recordVideo">录像</button>
  <video src="{{videoPath}}" controls/>
</view>

js 文件:

Page({
  data: {
    videoPath: ''
  },
  recordVideo() {
    wx.chooseVideo({
      sourceType: ['camera'],
      maxDuration: 60,
      camera: 'back',
      success: (res) => {
        this.setData({
          videoPath: res.tempFilePath
        });
      },
      fail: (err) => {
        console.error('录像失败:', err);
      }
    });
  }
});

二、音频播放与录音

微信小程序提供了 wx.createInnerAudioContextwx.getRecorderManager API,用于音频播放和录音。

1. 音频播放

wxml 文件:

<view class="container">
  <button bindtap="playAudio">播放音频</button>
</view>

js 文件:

Page({
  onReady() {
    this.innerAudioContext = wx.createInnerAudioContext();
    this.innerAudioContext.src = 'https://example.com/audio.mp3';
  },
  playAudio() {
    this.innerAudioContext.play();
  },
  onUnload() {
    this.innerAudioContext.destroy();
  }
});
2. 录音

wxml 文件:

<view class="container">
  <button bindtap="startRecording">开始录音</button>
  <button bindtap="stopRecording">停止录音</button>
  <audio src="{{recordingPath}}" controls/>
</view>

js 文件:

Page({
  data: {
    recordingPath: ''
  },
  onReady() {
    this.recorderManager = wx.getRecorderManager();
    this.recorderManager.onStop((res) => {
      this.setData({
        recordingPath: res.tempFilePath
      });
    });
  },
  startRecording() {
    this.recorderManager.start({
      duration: 60000,
      sampleRate: 44100,
      numberOfChannels: 1,
      encodeBitRate: 192000,
      format: 'aac'
    });
  },
  stopRecording() {
    this.recorderManager.stop();
  }
});

图像处理

三、图片裁剪与编辑

微信小程序提供了 canvas API,可以用来实现图片的裁剪与编辑功能。

1. 图片裁剪

wxml 文件:

<view class="container">
  <canvas canvas-id="myCanvas" style="width: 300px; height: 300px;"></canvas>
  <button bindtap="chooseImage">选择图片</button>
  <button bindtap="cropImage">裁剪图片</button>
</view>

js 文件:

Page({
  data: {
    imagePath: ''
  },
  chooseImage() {
    wx.chooseImage({
      count: 1,
      success: (res) => {
        this.setData({
          imagePath: res.tempFilePaths[0]
        });
        this.drawCanvas();
      }
    });
  },
  drawCanvas() {
    const ctx = wx.createCanvasContext('myCanvas');
    ctx.drawImage(this.data.imagePath, 0, 0, 300, 300);
    ctx.draw();
  },
  cropImage() {
    wx.canvasToTempFilePath({
      canvasId: 'myCanvas',
      x: 50,
      y: 50,
      width: 200,
      height: 200,
      destWidth: 200,
      destHeight: 200,
      success: (res) => {
        this.setData({
          imagePath: res.tempFilePath
        });
      }
    });
  }
});

四、图片滤镜

使用 canvas API 可以实现简单的图片滤镜效果。

wxml 文件:

<view class="container">
  <canvas canvas-id="myCanvas" style="width: 300px; height: 300px;"></canvas>
  <button bindtap="applyFilter">应用滤镜</button>
</view>

js 文件:

Page({
  data: {
    imagePath: ''
  },
  onLoad() {
    this.chooseImage();
  },
  chooseImage() {
    wx.chooseImage({
      count: 1,
      success: (res) => {
        this.setData({
          imagePath: res.tempFilePaths[0]
        });
        this.drawCanvas();
      }
    });
  },
  drawCanvas() {
    const ctx = wx.createCanvasContext('myCanvas');
    ctx.drawImage(this.data.imagePath, 0, 0, 300, 300);
    ctx.draw();
  },
  applyFilter() {
    const ctx = wx.createCanvasContext('myCanvas');
    ctx.drawImage(this.data.imagePath, 0, 0, 300, 300);
    ctx.draw(false, () => {
      wx.canvasGetImageData({
        canvasId: 'myCanvas',
        x: 0,
        y: 0,
        width: 300,
        height: 300,
        success: (res) => {
          let data = res.data;
          for (let i = 0; i < data.length; i += 4) {
            // 简单的灰度滤镜
            let gray = (data[i] + data[i + 1] + data[i + 2]) / 3;
            data[i] = data[i + 1] = data[i + 2] = gray;
          }
          wx.canvasPutImageData({
            canvasId: 'myCanvas',
            x: 0,
            y: 0,
            width: 300,
            height: 300,
            data: data,
            success: () => {
              console.log('滤镜应用成功');
            }
          });
        }
      });
    });
  }
});

小测试 🧪

  • 实现一个简单的拍照功能,并将照片展示在页面上。
  • 实现一个简单的录音功能,并将录音文件播放出来。
  • 实现一个简单的图片裁剪功能,选择一张图片并裁剪后展示。
  • 实现一个简单的图片滤镜功能,对图片应用灰度滤镜效果。

今日学习总结 📚

概念详细内容
拍照与录像使用 wx.chooseImagewx.chooseVideo 实现拍照和录像
音频播放与录音使用 wx.createInnerAudioContextwx.getRecorderManager 实现音频播放和录音
图片裁剪使用 canvas API 实现图片裁剪功能
图片滤镜使用 canvas API 实现简单的图片滤镜效果

结语

通过今天的学习,你应该掌握了如何在小程序中实现多媒体功能与图像处理。这些技术可以帮助你在小程序中实现丰富的多媒体交互,提高用户体验。明天我们将探讨小程序的社交分享与消息推送。如果你有任何疑问,欢迎关注并留言在我的公众号猫头虎技术团队。📩


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/660253.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SRE视角下的DevOps构建之道

引言&#xff1a; 随着数字化时代的飞速发展&#xff0c;软件成为了企业竞争力的核心。为了更高效地交付高质量的软件&#xff0c;DevOps&#xff08;Development和Operations的组合&#xff09;作为一种文化、实践和工具集的集合&#xff0c;逐渐成为了行业内的热门话题。然而…

记录贴 Elasticsearch的RestClient进行DSL查询

must&#xff1a;必须匹配每个子查询&#xff0c;类似“与” should&#xff1a;选择性匹配子查询&#xff0c;类似“或” must_not&#xff1a;必须不匹配&#xff0c;不参与算分&#xff0c;类似“非” filter&#xff1a;必须匹配&#xff0c;不参与算分 package com.h…

java中的工具类

以下是我们到现在学的三个类 在书写工具类的时候我们要遵循以下的规则 类名见面知意是为了知道这个工具类的作用 私有化构造方法的作用是为了不让外界不能创造这个类的对象吗&#xff0c;因为工具类不是描述一个事物的&#xff0c;它是一个工具。 方法定义位静态是为了方便调用…

网页中的音视频裁剪拼接合并

一、需求描述 项目中有一个配音需求&#xff1a; 1&#xff09;首先&#xff0c;前台会拿到一个英语视频&#xff0c;视频的内容是A和B用英语交流&#xff1b; 2&#xff09;然后&#xff0c;用户可以选择为某一个角色配音&#xff0c;假如选择为A配音&#xff0c;那么视频在播…

Linux学习笔记(二)

一、Linux文件目录 1.命令&#xff1a;tree -L 1 2.挂载命令&#xff08;例如U盘&#xff0c;需要挂载之后才能访问&#xff09;&#xff1a; mount /dev/cdrom /mnt ls /mnt 3.查看登录信息&#xff1a; last / lastlog 4.修改/查看网络信息 vi /etc/sysconfig/netw…

kubernetes-PV与PVC

一、PV和PVC详解 当前&#xff0c;存储的方式和种类有很多&#xff0c;并且各种存储的参数也需要非常专业的技术人员才能够了解。在Kubernetes集群中&#xff0c;放了方便我们的使用和管理&#xff0c;Kubernetes提出了PV和PVC的概念&#xff0c;这样Kubernetes集群的管理人员就…

jsRpc js逆向远程调用加密函数

rpc介绍&#xff1a; RPC 全称 Remote Procedure Call——远程过程调用,简单说就是为了解决远程调用服务的一种技术&#xff0c;使得调用者像调用本地服务一样方便透明&#xff1b; 使用RPC服务就可以直接在浏览器中的页面js中注入代码&#xff0c;将其作为一个客户端&#xff…

真实故障分享,H3C ER3208G3-X路由器-双绞线一闪一停

六类非屏蔽双绞线 网线钳 如上图所示&#xff0c;2号线接到h3c路由器出现网线一闪一停&#xff0c;用对线器测试一到8芯能一一对应&#xff0c;无法上网。2号线接到h3c交换机能正常上网&#xff0c;难道是网线对568A 568B有要求&#xff1f; 解决方式&#xff1a;通过两端568…

电脑丢失api-ms-win-crt-runtime-l1-1-0.dll的多种修复方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“api-ms-win-crt-runtime-l1-1-0.dll丢失”。这个错误通常发生在Windows操作系统中&#xff0c;它表示一个动态链接库文件丢失或损坏。这个问题可能会导致某些应用程序无法正常运行&#xf…

synchronized 锁的到底是什么?

通过8种情况演示锁运行案例&#xff0c;看看我们到底锁的是什么 1锁相关的8种案例演示code package com.bilibili.juc.lock;import java.util.concurrent.TimeUnit;/*** 题目&#xff1a;谈谈你对多线程锁的理解&#xff0c;8锁案例说明* 口诀&#xff1a;线程 操作 资源类* 8…

代码随想录算法训练营第36期DAY43

DAY43 343整数拆分 注意&#xff1a;当几个数的数值相近&#xff0c;乘积才会尽可能地大&#xff08;好想&#xff1a;数一大一小&#xff0c;最大当然是自己乘以自己&#xff09; 代码随想录官方题解&#xff1a; class Solution {public: int integerBreak(int n) { …

【Tlias智能学习辅助系统】01 准备工作

Tlias智能学习辅助系统 01 创建员工、部门表创建springboot工程&#xff0c;引入对应的起步依赖(web、mybatis、mysql驱动、lombok)准备 Mapper、Service、Controller 等基础结构MapperServiceControllerpojo封装类application.properties 接口开发规范 创建员工、部门表 -- 创…

前端调用exe程序配置

前置条件 访问端安装好需要调用的exe程序 1、新建reg文件 先新建一个txt文件&#xff0c;重命名为xx.reg 点击是&#xff0c;确认更改 2、编写注册表内容 右键点击文件&#xff0c;用记事本打开&#xff0c;输入以下内容 将下面的${exeName}修改为自定义的程序名&#x…

Web开发中,就session和cookie相比,用session比用cookie的优点有哪些?

在Web项目中&#xff0c;session和cookie都是用于存储用户数据的机制&#xff0c;但它们有不同的优缺点。使用session比使用cookie有以下几个主要优点&#xff1a; 1. 安全性更高 敏感数据保护&#xff1a;Session数据存储在服务器端&#xff0c;而不是客户端。这样&#xff…

Nginx教程(持续更新中~)

浏览器优先查看host文件中的映射&#xff0c;如果host中没有就会从网上CDN找该域名对应的ip,但是目前使用的www.123.com是外卖假设的&#xff0c;CDN中并没有&#xff0c;所以就采用host中填写 第二种weight: 第三种 ip_hash: 第四种 fair: ​​​​​​

倩女幽魂手游攻略:新人入坑必看指南!

《倩女幽魂》是一款经典的MMORPG游戏&#xff0c;凭借其丰富的剧情、精美的画面和多样的玩法&#xff0c;吸引了众多玩家。在游戏中&#xff0c;提升角色等级和战斗力是每个玩家的核心目标。本文将详细介绍如何在游戏中快速提升角色等级、增强实力&#xff0c;并提供一些实用的…

MyBatisPlus学习笔记(二)

条件构造器&#xff1a; Wrapper的作用就是来封装我们当前的条件的 删除用的和查询用的一样&#xff1a;QueryWrapper 和 LambdaQueryWrapper MyBatis-Plus分页插件的配置和使用 Ctrl H 查看当前接口或者类的一个继承关系 Ctrl P 分页插件 乐观锁和悲观锁 通用枚举 代码…

leetcode 1270 向公司CEO汇报工作的所有人(postgresql)

需求 员工表&#xff1a;Employees ---------------------- | Column Name | Type | ---------------------- | employee_id | int | | employee_name | varchar | | manager_id | int | ---------------------- employee_id 是这个表的主键。 这个表中每一行中&#xff0c;e…

基于k-NN + GCN的轴承故障诊断模型

目录 往期精彩内容&#xff1a; 创新点&#xff1a; 前言 1 轴承故障数据的预处理 1.1 导入数据 1.2 数据预处理&#xff0c;制作数据集 2 基于Pytorch的GCN轴承故障诊断 2.1 定义GCN分类网络模型 2.2 设置参数&#xff0c;训练模型 2.3 模型评估 代码、数据如下&…

AI大模型探索之路-实战篇10:数据预处理的艺术:构建Agent智能数据分析平台的基础

系列篇章&#x1f4a5; AI大模型探索之路-实战篇4&#xff1a;深入DB-GPT数据应用开发框架调研 AI大模型探索之路-实战篇5&#xff1a;探索Open Interpreter开放代码解释器调研 AI大模型探索之路-实战篇6&#xff1a;掌握Function Calling的详细流程 AI大模型探索之路-实战篇7…