html2canvas 將代碼轉為圖片

2021-02-19 前端大全

(點擊上方公眾號,可快速關注)

作者:伯樂在線專欄作者 - 十年蹤跡

連結:http://web.jobbole.com/86353/

點擊 → 了解如何加入專欄作者


最近,我通過眾成翻譯學習和翻譯了一系列優秀的文章,許多文章都值得向大家推薦。但是,好的技術文章通常都有大段的代碼。一般情況下,這並沒有什麼問題,因為不論是眾成翻譯、我的博客或者是其他轉載技術類文章的平臺,一般都支持代碼的語法高亮展示和閱讀。

但是,也有一些公共的平臺對代碼的支持並不理想,比如微博的長微博:

長微博裡編輯正常的代碼

到了預覽的時候被「自動壓縮」了

再比如微信公眾號,粘貼文章的時候,如果有代碼,會丟失掉代碼裡面的一些換行。如果代碼較短還好,可以手工編輯下,但是如果是長代碼的話,效果簡直是慘不忍睹,也很難編輯:

博客裡正常的代碼

貼到微信公眾號編輯文章裡慘不忍睹

如果一一把代碼格式調整好會是一個非常巨大的工作量,偶爾做一下還好,如果天天要把時間花費在編輯和調整代碼的格式上,那也太悲催了。

為了更好地在各種非主流(對程式設計師來說)的平臺上愉快地貼代碼,我們只能幹脆將代碼轉為圖片。最簡單的轉換方式,當然是——截屏。

截屏的問題

利用作業系統自帶的截屏或者其他工具的截屏功能來截取代碼當然是可行的。只是,不管是系統默認截屏還是截屏工具,都不是特別好用,尤其當代碼超過一屏的時候,還得分屏截取,而當你決定修改代碼的一部分的時候,有可能又要調整和重新截屏,這對於一大段一大段代碼的文章編輯來說是個噩夢一樣的體驗,而且截成一段段的代碼,對讀者也不友好。

另外一個截屏的問題是,截屏效果依賴於我們使用的 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 rendered  element

    }

});

在實際使用的時候,有兩個注意點:

html2canvas 通過解析元素實際的樣式來生成 canvas 圖片內容,因此它對元素實際的布局和視覺顯示有要求。如果要完整截圖,最好將元素從文檔流中獨立出來(例如 position:absolute)

默認生成的 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.h5jun.com/#css。

使用 CSS 語法高亮擴展

使用 hash 來標記擴展的好處是,我在頁面頂部放了一些常用語言的擴展連結,切換這些連結的時候由於是改變 hash,不會刷新頁面。

在第一次切換到某個擴展的語言時,需要加載相應的 js 文件:

var srcMap = {

  "apollo": "lang-apollo.js",

  "basic": "lang-basic.js",

  "clojure": "lang-clj.js",

  "css": "lang-css.js",

  "dart": "lang-dart.js",

  "erlang": "lang-erlang.js",

  "go": "lang-go.js",

  "haskell": "lang-hs.js",

  "lasso": "lang-lasso.js",

  "lisp": "lang-lisp.js",

  "scheme": "lang-lisp.js",

  "llvm": "lang-llvm.js",

  "logtalk": "lang-logtalk.js",

  "lua": "lang-lua.js",

  "matlab": "lang-matlab.js",

  "ml": "lang-ml.js",

  "mumps": "lang-mumps",

  "nemerle": "lang-n.js",

  "pascal": "lang-pascal.js",

  "protocol": "lang-proto.js",

  "r": "lang-r.js",

  "rd": "lang-rd.js",

  "rust": "lang-rust.js",

  "scala": "lang-scala.js",

  "sql": "lang-sql.js",

  "swift": "lang-swift.js",

  "tcl": "lang-tcl.js",

  "latek": "lang-tex.js",

  "vb": "lang-vb.js",

  "vhdl": "lang-vhdl.js",

  "wiki": "lang-wiki.js",

  "xq": "lang-xq.js",

  "yaml": "lang-yaml.js"

};

 

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+ 種不同語言的語法高亮

支持多屏的長代碼轉成一張圖片

如果你有在微信平臺或者微博上發技術文章的需求,你應該可以用到它。

對它感興趣,可以 check out (https://github.com/akira-cn/code-to-image)整個項目的最新版本。

專欄作者簡介 ( 點擊 → 加入專欄作者 )

十年蹤跡:月影,奇舞團團長,熱愛前端開發,JavaScript 程序猿一枚,能寫代碼也能打雜賣萌說段子。

打賞支持作者寫出更多好文章,謝謝!

【今日微信公號推薦↓】

更多推薦請看值得關注的技術和設計公眾號

其中推薦了包括技術設計極客 和 IT相親相關的熱門公眾號。技術涵蓋:Python、Web前端、Java、安卓、iOS、PHP、C/C++、.NET、Linux、資料庫、運維、大數據、算法、IT職場等。點擊《值得關注的技術和設計公眾號》,發現精彩!

相關焦點

  • html2canvas - 動態生成海報的優質js庫
    今天分享的html2canvas就可以。介紹在微信項目中經常會遇到動態生成海報的需求,Web前端合成圖片往往會使用canvas。canvas雖然強大,但用來合成海報非常繁瑣,一不小心就幾百行代碼了。而html2canvas.js是一款輕鬆地將HTML+CSS寫成的布局直接轉換成canvas,生成可保存分享的圖片。
  • 利用html5 canvas實現純前端上傳圖片的裁剪
    許多網站都有設置用戶頭像的功能,用戶可以選擇一張本地的圖片,然後用網站的裁剪工具進行裁剪,然後設置大小,位置合適的頭像.當然,網上也有一些用js寫的諸如此類裁剪的插件,但是有許多都是前端將圖片的一些裁剪參數(如坐標)傳給後臺,有java程式設計師進行真正的圖片裁剪.今天自己研究了一些,做了一個純前端裁剪的demo,如下:1.html部分:<div>
  • html中繪製圖形標籤的詳細介紹
    本篇將介紹的是html中<canvas>標籤的用法,感興趣的朋友可以一起研究一下!在html5中,新增了很多實用的標籤,今天為大家介紹的是html5新增標籤<canvas>,<canvas>標籤只是一個容器,對內容並沒有樣式的更改。那它在html中有什麼用,接下來我們就一起來看看吧!
  • 數據可視化 - canvas圖片壓縮
    DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title>
  • 7款超華麗的HTML5 Canvas文字動畫特效
    在線演示/源碼下載2、超華麗CSS3 3D五彩發光文字動畫不久前我們已經為大家介紹過一些炫酷的CSS3文字動畫和HTML5文字特效,有些都非常不錯,比如最近剛分享的CSS3文字跳動旋轉動畫以及HTML5
  • 基於HTML5 Canvas 的交互式地鐵線路圖
    感覺總是有各種容易看串的信息,利用 html5 canvas 完成的這個交互式地鐵線路圖 Demo,如果地鐵上的展示信息稍微有點交互會怎麼樣?不用忙著上車下車,輕輕一點,就能省去很多時間。將 lineNum 中的元素和顏色傳到 createLine 函數中,根據這兩個參數來繪製地鐵線路以及配色,畢竟 js 文件中的命名方式也是有規律的,哪一條線路,則命名後面一定會加上對應的數字,所以我們只需要將字符串與這個編號結合即可獲得 js 中對應的數組了:createLine 的定義也非常簡單,我的代碼設置了不少的樣式,所以看起來有點多。
  • 前端小白基礎之html代碼規範
    1. img標籤要寫alt屬性<img src="chime-logo.svg" alt="ABC Company">這是為了預防你圖片加載不出來,顯示alt裡的內容2.單標籤不要寫閉合標籤 因為寫了也沒用,還顯得你不懂html規範,我們不是寫XHTML。常見的單標籤有img、link、input、hr、br<img src=" " alt=" ">和<img src=" " alt=" "></img>是一樣的3.
  • HTML4 和 HTML5 的10個關鍵區別
    2. 簡化的語法 HTML5簡化了很多細微的語法,例如doctype的聲明,你只需要寫<!doctype html>就行了。HTML5與HTML5,XHTML1兼容,但是與SGML不兼容。 3.
  • 15 個 HTML5 Canvas 應用欣賞
    今天,我們收集了15個優秀的canvas應用,每個開發者都應該知道。Sketchpad 是個優秀的 HTML5 應用,幫助我們創建有用的繪圖應用,使用JS和canvas元素。Sketchpad 的繪圖工具具有豐富的功能。
  • canvas 入門實戰--邀請卡生成與下載
    代碼已上傳github,需要的歡迎star(downloadImg)。大家看這篇文章之前,要了解javascript的一些基礎,也要看著了解一些canvas的api(canvas-MSN教程,canvas菜鳥教程)2.邀請卡實例邀請卡自動生成這個會有的,畢竟有時候,很多邀請卡都是一樣的,就是被邀請的人不一樣而已,也就是說,整個邀請卡,就是一個名字不一樣,那麼下面。
  • 八大瘋狂的 HTML5 Canvas 及 WebGL 動畫效果
    蠕蟲 HTML5 Canvas製作的效果,無數條蠕蟲根據灰度組成圖片,你還可以拖拽一張本地圖片到右側。 Conductor 將紐約地鐵系統變成可以彈奏的弦樂器。 原文地址:http://favbulous.com/post/895/8-crazy-animations-withwebgl-and-html5-canvas文/hiwebgl
  • HTML零基礎入門
    HTML標籤是由尖括號包圍的關鍵詞,比如<html>,HTML標籤通常是成對出現的,比如<b>和</b>。 以下就是一個簡單的示例。由於是標記語言,不需要編譯器,所以可以直接使用電腦的文本進行編輯學習。可以在電腦上新建文本文檔,將上面的示例拷貝到文檔中,並將「新建文本文檔.txt」修改為「demo.html」,雙擊打開就可以看到網頁效果。
  • html代碼
    網頁將不能被另存為<noscript><iframe src=*.html></iframe></noscript>26.48、在網頁的Head部分加入如下代碼,這段代碼的主要功能是屏蔽PrintScreen鍵,不斷清空剪貼版,防止圖片被用文件——另存為菜單另存。
  • 用HTML5把Canvas緩衝區內容輸出到屏幕
    我會儘量簡要說明如何使用HTML5 canvas元素和JavaScript創建簡單的遊戲。本教程將省略一些代碼,但絕非故意。您可以隨時查看我的遊戲演示。</canvas></body></html>
  • File、Blob、dataURL 和 canvas 的應用與轉換
    來源 | https://www.cnblogs.com/Faith-Yin/p/14036049.html
  • Canvas框架-FabricJS簡介
    組合圖形(包括組合圖形、圖形文字、圖片等)等一系列功能。一個簡單的canvas demo通過fabric.Canvas獲取到canvas元素,並可以對canvas進行相應的設置,既可以通過獲取已存在的canvas元素,fabric也支持創建
  • 分享一個在線代碼美化工具:Dirty Markup
    同時它提供了很多的選項,可以有效的幫助你自定義你需要的,例如,HTML代碼格式:1.Doctype2.輸出3.縮進使用演示處理前:<!-- By GBin1.com--><!DOCTYPE html><html> <head> <title>GBin1 Balls demo for HTML Canvas</title> </head><body onmousedown="return false;"> <div id="container"> <canvas id="
  • 在線將Word轉為HTML,一鍵轉為更乾淨沒有格式問題的網頁程序碼
    WordHTML是一款在線的Word轉HTML免費轉換器,內置代碼清理功能,只要把Word、Excel或投影片內容複製到WordHTML,就能一鍵轉為更乾淨、沒有格式問題的網頁程序碼,貼到博客或網頁內的所見即所得編輯器就不會有亂七八糟的格式。此外,也支持PDF、Google Docs、Sheets等工具。
  • HTML實戰篇:html仿小米官網右側浮動框代碼
    本篇文章主要給大家介紹一下使用html+css來模仿製作小米官方網站右側的浮動框。1)製作頁面所需知識點1、列表標籤(dl dd dt)的使用,使用dl和dd來完成前邊5個相同模塊的製作2、滑鼠經過(hover)的使用,第一個元素滑鼠經過左側顯示,這個跟我們之前將的導航菜單類似,還有滑鼠經過文字以及圖片改變顏色,這裡可以使用hover之後改變背景圖片來實現;3、浮動(fixed)的使用,該內容一直浮動在網頁右側,跟隨頁面一起滾動
  • HTML代碼書寫規範指南
    </section>推薦:<section> <p>這是一個段落。</p> <p>這是一個段落。</p></section>關閉空的 HTML 元素在 HTML5 中, 空的 HTML 元素也不一定要關閉:在 XHTML 和 XML 中斜線 (/) 是必須的。如果你期望 XML 軟體使用你的頁面,使用這種風格是非常好的。