IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 项目实训(三):输入法开发(2) -> 正文阅读

[JavaScript知识库]项目实训(三):输入法开发(2)

本次开发主要实现前端截图上传,替换使用不太方便的图片上传文字上传

由于是从画板中截图,htmltopng之类的dom读取截图库就不可以使用

一开始考虑使用chrome extension实现截图,但实现起来效果不太理想(向js逻辑传递截图数据比较啰嗦,需要通过storage),且extension发布不方便还有浏览器限制与版本限制,考虑其他实现

后来经过调研发现getDisplayMedia可以获取屏幕视频流,可以把视频流打入video从中截取一屏内容读入canvas中实现截图

但这样截取的是整屏幕的内容,还需要做一个截屏中常用的拖拽截屏框,根据用户拖拽坐标计算出位置截取对应的图片即可

  getDisplayMedia(options) {
      // fill 不同版本的浏览器
      if (navigator.mediaDevices && navigator.mediaDevices.getDisplayMedia) {
        return navigator.mediaDevices.getDisplayMedia(options);
      }
      if (navigator.getDisplayMedia) {
        return navigator.getDisplayMedia(options);
      }
      if (navigator.webkitGetDisplayMedia) {
        return navigator.webkitGetDisplayMedia(options);
      }
      if (navigator.mozGetDisplayMedia) {
        return navigator.mozGetDisplayMedia(options);
      }
      throw new Error("getDisplayMedia is not defined");
    },
    async takeScreenshotStream() {
      // 计算屏幕实际长宽
      const width = screen.width * (window.devicePixelRatio || 1);
      const height = screen.height * (window.devicePixelRatio || 1);
      const errors = [];
      let stream;
      const mediaStreamConstraints = {
        audio: false,
        video: {
          width,
          height,
          frameRate: 1
        }
      };
      // 获取视频流,注意浏览器适配
      try {
        stream = await this.getDisplayMedia(mediaStreamConstraints);
      } catch (ex) {
        errors.push(ex);
      }

      if (errors.length) {
        console.debug(...errors);
        if (!stream) {
          throw errors[errors.length - 1];
        }
      }

      return stream;
    },
    async takeScreenshotCanvas() {
      const stream = await this.takeScreenshotStream();
      const video = document.createElement("video");
      const result = await new Promise((resolve, reject) => {
        // 将获取的流输入video中,pause后将将内容读取金canvas中
        video.onloadedmetadata = () => {
          video.play();
          video.pause();
          const canvas = document.createElement("canvas");
          canvas.width = video.videoWidth;
          canvas.height = video.videoHeight;
          const context = canvas.getContext("2d");
          context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
          resolve(canvas);
        };
        video.srcObject = stream;
      });

      stream.getTracks().forEach(function(track) {
        track.stop();
      });

      if (result == null) {
        throw new Error("Cannot take canvas screenshot");
      }

      return result;
    },
    async capture() {
      const pre = this.$refs.pre;
      const context = pre.getContext("2d");
      const createdCanvas = await this.takeScreenshotCanvas();
      const height = this.endY - this.startY;
      const width = this.endX - this.startX;
      // 根据用户选取的内容坐标将对应部分截取出来
      context.drawImage(
        createdCanvas,
        this.startX,
        this.startY + this.gap,
        width,
        height,
        0,
        0,
        32,
        32
      );
      const data_url = pre.toDataURL();
      // 把截取好的图片转为svg
      const content = await this.transferToSvg(data_url);
      document.getElementById("svg_holder").innerHTML = content;
      this.tip = "截图完成,图片预览:";
      this.svg_str = content;
      this.base_64 = data_url;
      this.captruing = false;
    },

实现效果

截图的图片质量相对上传的图片质量较差,增加色数为32色,效果如下?

同时实现了一个小输入框

?

?

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-06 10:58:50  更:2022-05-06 11:01:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:15:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码