紹介
- Skia Canvasは、Node.jsでHTML Canvas描画APIをブラウザなしで実装したライブラリ。
- GoogleのSkiaグラフィックスエンジンを基盤としており、Chromeの
<canvas>要素に近い結果を生成する。
- デスクトップやサーバーでハードウェアアクセラレーションによるグラフィックスをレンダリングしたり、多様な画像フォーマットを出力したりする用途に適している。
主な機能
- GPUでレンダリングが行われるため高速かつコンパクトで、RustとC++で書かれたネイティブコードが処理を担う。
- OSネイティブのグラフィックスパイプラインを使ってウィンドウにレンダリングでき、ブラウザに似たUIイベントフレームワークを提供する。
- ラスター(JPEG, PNG, WEBP)およびベクター(PDF, SVG)形式で画像を生成できる。
- 画像をファイルとして保存したり、バッファとして返したり、dataURL文字列にエンコードしたりできる。
- 非同期レンダリングやファイルI/Oのために、ユーザー設定可能なワーカープール上でネイティブスレッドを使用する。
- 1つのキャンバス上で複数の「ページ」を生成し、それを単一のマルチページPDF、または複数ファイルとして保存される画像シーケンスとして出力できる。
- 効率的なブール演算や点対点補間を用いて、ベジェパスの単純化、オフセット、結合、抽出、分解を行える。
- スケーリング、回転、変形に加えて、3D遠近変換も提供する。
- ビットマップベースのパターンだけでなく、ベクターベースのテクスチャで図形を塗りつぶせるほか、ユーザー定義マーカーで線を描ける。
- CSSフィルターの画像処理演算子を完全にサポートする。
- 複数行、単語折り返しテキスト、行ごとのテキストメトリクス、スモールキャップス、合字、その他のOpenType機能を含む、豊富なタイポグラフィ制御を提供する。
- システム外のフォントをローカルファイルから読み込んで使用できる。
使用例
画像ファイルの生成
Canvasを使って400x400サイズのキャンバスを作成し、2Dコンテキストを取得する。
createConicGradientを使って色のグラデーションを追加し、長方形を描く例を示す。
- 非同期関数
renderを通じて、画像を保存したり、バッファに変換したり、文字列として埋め込んだりする方法を説明する。
マルチページシーケンス
- 複数色のページを作成し、それをマルチページPDFとして保存する方法、または個別の画像ファイルとして保存する方法を説明する。
ウィンドウへのレンダリング
Windowを使って300x300サイズのウィンドウを作成し、drawイベントを通じて円を描く方法を説明する.
1件のコメント
Hacker Newsの意見
https://windowjs.orgは、Skia をラップして Canvas API として公開し、v8 を組み込んだ小さなランタイムを提供するプロジェクトNode と互換性のある Canvas 実装に興味があるなら、次のものも参考になる
canvaskit-wasmは Skia プロジェクトが提供しており、GPU アクセラレーションはサポートしていないようだ@napi-rs/canvasは最速のバインディングを提供するnode-canvasは Skia ではなく Cairo を使っているこうしたライブラリの用途が気になる
Skia は Node をサポートする WASM ビルドの CanvasKit を提供しており、このモジュールは Rust バインディング
Rust crate のラッパーに似たものなのか、という質問がある
Node/Web 向けに似たものを作ったことがあり、完璧ではないが良い
以前の試みでは Node-Gyp のインストールが必要で大変だった
単なるレンダリング API 以上のもの
https://malmal.ioで、サーバーで描画されたタイルのレンダリングに使っており、非常にうまく動作しているMapLibre のサーバーサイドレンダリングに役立つか気になる