Scratch3.0——作品截图
原文地址:https://blog.csdn.net/weiwoyonzhe/article/details/86603217
Scratch 的舞台是基于canvas,最初尝试直接通过canvas的dom,然后生成图片,但最后只能得到一个黑色的图片,得到黑色图片的原因是没有取到有效的canvas而不是因为图片跨域,当初在这里走了很多弯路,继续研究舞台组件stage.jsx,从vm.renderer可以获取canvas,于是通过这个canvas对象生成图片,记得当时的效果是偶尔会得到有效图片,但是大部分时候依然是黑色的图片,原因稍后回解释。为了实现截图,当时又进一步研究了renderer的代码,最后找到了draw方法,通过多次尝试发现在draw方法的最后执行canvas对象生成图片可以获得舞台的有效图片。
最初的笨办法
在node_modules中找到scratch-render/src/RenderWebGL.js中的draw方法,也可以直接在dist中修改编译后的文件。顺便解释一下draw是对舞台进行了清理和重新绘制,而draw的频率非常频繁,因此不能直接通过canvas获取图片。在重绘后追加获取图片的toDataURL方法,考虑到需要在gui里面调用,此处采用了监听键盘事件来通信,接收到截图请求将舞台图片放在window.sessionStorage内存中,在需要使用的时候可以直接从sessionStorage获得。
draw () {
this._doExitDrawRegion();
// 获取gl
const gl = this._gl;
//
twgl.bindFramebufferInfo(gl, null);
gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
gl.clearColor.apply(gl, this._backgroundColor);
gl.clear(gl.COLOR_BUFFER_BIT);
// 重新绘制
this._drawThese(this._drawList, ShaderManager.DRAW_MODE.default, this._projection);
// 增加如下代码
let img = new Image();
img.src = gl.canvas.toDataURL('image/png',0.7)
document.onkeydown = function (e) {
if(e.keyCode == 16){
window.sessionStorage.setItem("coverImg",img.src)
console.log('webGL')
}
}
}
带来问题
- 直接修改node_modules依赖的内容,严重影响团队开发、项目部署,提升了项目维护的复杂度。
- 每次draw都会执行toDataURL方法,并且赋值,增大了系统开销。
- 通过事件映射,提升了项目的复杂度。
优化
回归最初问题的本源,不能直接从canvas.toDataURL获得舞台截图的原因是执行toDataURL的时候可能正好draw在重绘。因此先截图前先draw然后获取图片。
this.renderer.draw();
const img = new Image();
img.src = this.canvas.toDataURL('image/png', 0.7);
Scratch3.0——作品截图的更多相关文章
- Scratch3.0——项目层次结构
原文地址:https://blog.csdn.net/weiwoyonzhe/article/details/86603757 简要介绍: 本文旨在介绍scratch3.0项目层次结构及关键功能. 源 ...
- Scratch3.0设计的插件系统(上篇)
我们每个人在内心深处都怀有一个梦想: 希望创造出一个鲜活的世界,一个宇宙.处在我们生活的中间.被训练为架构师的那些人,拥有这样的渴望: 在某一天,在某一个地方,因为某种原因,创造出了一个不可思议的.美 ...
- 如何更改scratch3.0的文字
首先,我们来看以下的图,我们需要更改scratch3.0的文字,例如文件,新作品,从电脑上传等文字. 打开源码,目录src/compents/menu-bar/menu-bar.jsx 大家会发现,所 ...
- Scratch3.0——克隆代码仓库的正确姿势
原文地址:https://blog.csdn.net/weiwoyonzhe/article/details/86603450 对Scratch3.0进行二次开发,首先要在github上fock官方代 ...
- 如何为scratch3.0创建一个独立的页面或窗体
很多人都利用GIT上的scratch3.0做开发,但是苦于有些定制需要个性化开发但是不知道如何动手.本篇文章来做好普及工作吧. 首先需要完成事项如下: 1.需要进行modal定义 2.新增窗口的UI界 ...
- 如何将scratch3.0的作业自动提交到后台数据库
大家都知道Scratch3.0开发后,默认是可以下载文件到电脑,但是如果是作为商业系统来说,我们需要将作业自动的提交到后台,因此有了这篇文章. 首先,我们来分解下开发步骤: 1.在菜单栏新增一个上传到 ...
- Robotutor Scratch3.0 在线编程平台升级啦!
Robotutor推出的Scratch3.0在线编程平台受到很多编程老师和学员的喜爱,上一个版本我们提供了用户注册,找回密码,个人项目的在线保存和浏览,社区分享评论. 我们根据实际的教学需要,用户角色 ...
- Robotutor Scratch3.0 在线编程平台上线!
终于,Scratch3.0在线编程平台上线了,不容易阿! 欢迎试用 https://scratch.robotutor.cn 欢迎交流,WeChat ID: iamlinweidong
- 如何自动加载scratch3.0的页面上实现自动加载原有的作品
首先,我们在安装scratch3.0后,浏览器默认打开的是编程的页面.如下图: 那么我们希望开发一个功能,就是打开的时候默认加入某一个SB3的开发文件 1.首先,我们需要有一个.SB3的开发文件,建议 ...
随机推荐
- goahead3.6.3就基本使用(后台上传信息到html页面),高手请忽略
声明:这里面的代码均为网上找的然后有小小的改动,并非原创.但文章为原创 一..编译 1.1,.下载:进入http://embedthis.com/goahead/下载goahead3.6.3(2017 ...
- Redis之hiredis API (String)
String // // Created by zhangrongxiang on 2018/3/7 13:48 // File string2 // #include <hiredis/hir ...
- 一头扎进 Java IO中-------java IO文件
Java IO: 文件 在Java应用程序中,文件是一种常用的数据源或者存储数据的媒介.所以这一小节将会对Java中文件的使用做一个简短的概述.这篇文章不会对每一个技术细节都做出解释,而是会针对文件存 ...
- 发布 .Net Core WebAPI 应用程序到 Docker
目录 1. 创建 .net core webapi 项目 2. 编译应用 3. 创建 Dockerfile 文件 4. 上传文件到服务器 5. 生成Docker Image 6. 在Docker Co ...
- 动态rem解决移动前端适配
背景 移动前端适配一直困扰很多人,我自己也是从最初的媒体查询,到后来的百分比,再到padding-top这种奇巧淫技,再到css3新单位vw这种过渡转变 但这些都或多或少会有些问题,直到使用了动态re ...
- linux改目录权限和宿主。
改宿主. [sudo chown 用户名:用户组 ./目录/*] 改权限 [ sudo chmod -R 775 ./目录]
- PictureBox控件
PictureBox控件可以显示来自位图.图标或者元文件,以及来自增强的元文件.JPEG.GIF文件的图形,如果控件不足以显示整幅图像,则裁剪图像以适应控件的大小. Sizemode 图片的大小方式 ...
- 使用 OLEDB 及 SqlBulkCopy 将多个不在同一文件夹下的 ACCESS mdb 数据文件导入MSSQL
注:转载请标明文章原始出处及作者信息http://www.cnblogs.com/z-huifei/p/7380388.html 前言 OLE DB 是微软的战略性的通向不同的数据源的低级应用程序接口 ...
- sql = 和<>遵循的sql-92标准的设置SET ANSI_NULLS ON
说明 SQL-92 标准要求在对空值进行等于 (=) 或不等于 (<>) 比较时取值为 FALSE. 当 SET ANSI_NULLS 为 ON 时,即使 column_name 中包含空 ...
- SpringMVC笔记:annotation注解式开发
一.配置式开发 在我们之前的学习中,springmvc使用配置式开发模式,需要在核心配置文件中springmvc.xml注册大量的bean来注入controller控制器,工作繁琐容易出错,下面我们学 ...