2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

video,canvas要素のスクリーショットを撮るライブラリを作った(WebGL対応)

Last updated at Posted at 2023-10-28

video,canvas要素のスクリーンショットを撮る非常にシンプルなライブラリです。
canvasのcontextTypeがwebglでも期待したスクリーショットが取得できます。

なぜ作ったのか?

  1. 今動いている2つのサービスで使う予定でライブラリ化するメリットがあるから。
  2. contextTypeがwebglの時のスクリーショットが撮れないと困っている人が自分以外にもいたから。

canvasのcontextTypeがwebglの時にスクリーショットが空になる問題

(出力が画像がpngなら透明、jpegなら真っ黒の画像になります。)

上の記事の回答にあるように、Three.jsではpreserveDrawingBuffer: trueにすることで、空ではないスクリーショットが撮ることができます。

Three.jsの説明ではpreserveDrawingBufferについてこう書かれています。

preserveDrawingBuffer - 手動でクリアまたは上書きされるまでバッファを保存するかどうか。デフォルトはfalseです。

バッファを保存しないのでtoDataURL()をしたタイミングにより空の画像が出力されます。タイミングによっては期待した画像が出力されこともあります。

preserveDrawingBuffer: trueにすることでパフォーマンスも落ちてしまいますので、できればtrueにするのは避けたいですね。

解決策

canvas(contextType: webgl) -> canvas(contextType: 2d) にデータをコピーしcanvas(contextType: 2d)からtoDataURLを行っています。

詳しくは作成したライブラリのコードを見ていただければと思います。
https://github.com/matometaru/video-canvas-screenshot

参考

ライブラリの環境は以下の記事を参考にさせていただきました。非常に分かりやすかったです。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?