温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

html2canvas将代码转为图片的方法

发布时间:2021-03-01 14:17:24 来源:亿速云 阅读:238 作者:小新 栏目:web开发

小编给大家分享一下html2canvas将代码转为图片的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

截屏的问题

利用操作系统自带的截屏或者其他工具的截屏功能来截取代码当然是可行的。只是,不管是系统默认截屏还是通过截屏工具,都不是特别好用,尤其当代码超过一屏的时候,还得分屏截取,而当你决定修改代码的一部分的时候,有可能又要调整和重新截屏,这对于一大段一大段代码的文章编辑来说是个噩梦一样的体验,而且截成一段段的代码,对读者也不友好。

另外一个截屏的问题是,截屏效果依赖于我们使用的 IDE,有可能写不同的代码使用不同的 IDE,比如我喜欢用 vim 写 json 配置和 nginx 配置,但我用 Sublime Text 3 编辑 HTML、CSS 和 JS,如果要写 Android Native 代码,我用 Android Studio,写其他一些编程语言,我可能会使用 XCode。不同的 IDE 界面截出来的代码风格看起来不同,这样就会造成文章之间风格不统一或者甚至一篇文章中的代码风格也五花八门,这对于希望自己的文章被完美呈现的作者来说,简直不能忍。

用工具将代码转图片

为了解决截屏的这些问题,我写了一个在线代码转图片的工具(github 代码仓库 ),将代码粘贴进输入框,点击左上角的相机图标或者用键盘快捷键 Ctrl+D ,就可以自动将代码转成语法高亮的图片。

代码段即使很长,超过屏幕高度,也能轻松截取下来:

语法高亮基于 Code Prettify ,支持超过 40 种编程语言的语法高亮。主流编程语言自动识别,不需要选择语言类型就可以自动识别“Java、JS、HTML、C、C++、Python、PHP”等主流编程语言。

转换代码到图片使用 html2canvas ,这是一个非常著名的从浏览器网页截图的开源库,使用很方便,功能也很强大。

使用 html2canvas

html2canvas 的使用非常简单,简单到只需要传入一个 DOM 元素,然后通过回调拿到 canvas:

html2canvas(element, {   
onrendered: function(canvas) {        
// canvas is the final renderedelement    
}});

在实际使用的时候,有两个注意点:

  1. html2canvas 通过解析元素实际的样式来生成 canvas 图片内容,因此它对元素实际的布局和视觉显示有要求。如果要完整截图,最好将元素从文档流中独立出来(例如 position:absolute)

  2. 默认生成的 canvas 图片在 retina 设备上显示很模糊,处理成 2 倍图能解决这个问题:

var w = $("#code").width();
var h = $("#code").height();//要将 canvas 的宽高设置成容器宽高的 2 倍
var canvas = document.createElement("canvas");
canvas.width = w * 2;
canvas.height = h * 2;
canvas.style.width = w + "px";
canvas.style.height = h + "px";
var context = canvas.getContext("2d");//然后将画布缩放,将图像放大两倍画到画布上
context.scale(2,2);
html2canvas(document.querySelector("#code"), {    
canvas: canvas,    onrendered: function(canvas) {        ...    }});

对多语言的支持

Code Prettify 默认支持多种语言,所以一开始的时候,没有设计成让用户能够手动切换语言,但是发现这样做,在展示 CSS 的时候效果不好:

上面的代码里,CSS 的 ID 选择器被识别成代码注释了,查看 Code Prettify 的 官方文档 发现,它默认支持的语言中不包括 CSS,CSS 和其他一些语言的语法高亮需要通过扩展来实现。

使用扩展

我使用 URL 的 hash 来标记扩展,例如要使用 CSS 扩展,可以使用 http://code2img.test.h6jun.com/#css 。

使用 hash 的好处是,我在页面顶部放了一些常用语言的扩展链接,切换这些链接的时候由于是改变 hash,不会刷新页面。

第一次 切换到某个扩展的语言时,需要加载相应的 js 文件:

var srcMap = {  "apollo": "lang-apollo.js?7.1.34",  
"basic": "lang-basic.js?7.1.34",  
"clojure": "lang-clj.js?7.1.34",  
"css": "lang-css.js?7.1.34",  
"dart": "lang-dart.js?7.1.34",  
"erlang": "lang-erlang.js?7.1.34",  
"go": "lang-go.js?7.1.34",  
"haskell": "lang-hs.js?7.1.34",  
"lasso": "lang-lasso.js?7.1.34",  
"lisp": "lang-lisp.js?7.1.34",  
"scheme": "lang-lisp.js?7.1.34",  
"llvm": "lang-llvm.js?7.1.34",  
"logtalk": "lang-logtalk.js?7.1.34",  
"lua": "lang-lua.js?7.1.34",  
"matlab": "lang-matlab.js?7.1.34",  
"ml": "lang-ml.js?7.1.34",  
"mumps": "lang-mumps",  
"nemerle": "lang-n.js?7.1.34",  
"pascal": "lang-pascal.js?7.1.34",  
"protocol": "lang-proto.js?7.1.34",  
"r": "lang-r.js?7.1.34",  
"rd": "lang-rd.js?7.1.34",  
"rust": "lang-rust.js?7.1.34",  
"scala": "lang-scala.js?7.1.34",  
"sql": "lang-sql.js?7.1.34",  
"swift": "lang-swift.js?7.1.34",  
"tcl": "lang-tcl.js?7.1.34",  
"latek": "lang-tex.js?7.1.34",  
"vb": "lang-vb.js?7.1.34",  
"vhdl": "lang-vhdl.js?7.1.34",  
"wiki": "lang-wiki.js?7.1.34",  
"xq": "lang-xq.js?7.1.34", 
 "yaml": "lang-yaml.js?7.1.34"
 };
 function loadPlugin(lang)
 {  
 var js = srcMap[lang.toLowerCase()];    
 if(typeof js === "string")
 {    
 var script = document.createElement("script");    
 script.src = "/static/js/" + js;    
 document.body.appendChild(script);  
 }   
 /srcMap[lang] 设为 true,表示已经加载过,下次切换就不会再加载  
 srcMap[lang] = true;    
 }

许可协议

由于 Code Prettify 采用 Apache License 2.0 ,而 html2canvas 采用一个 非商业授权 的 协议 ,因此,本项目采用双重许可协议,使用、修改和分发本项目代码需要遵守两个协议。

总结

由于一些平台对文本代码支持不友好,因此我使用 html2canvas 和 Code Prettify 来实现一个将代码转为图片的工具,它的特点如下:

  • 在线转换代码为 jpeg base64 图片

  • 支持 40+ 种不同语言的语法高亮

  • 支持多屏的长代码转成一张图片

以上是“html2canvas将代码转为图片的方法”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI