ウェブワーカーで実行されているasm.jsコードで画像を生成したいと思います。そして、私はその計算の最新の状態をユーザが見ることができる2Dキャンバスに、他のいくつかのコンテンツと共に定期的に合成したいと思います。現在、私はcreateImageBitmapサファリの代替
- が
- 、
ImageBitmap
にImageData
を回すために、asm.jsコードによって使用される配列バッファの部分に基づいて、 - コール
createImageBitmap
をits constructorを用いImageData
オブジェクトを構築するコードを有しますtransfersワーカーからGUIスレッドへの画像ビットマップ - は、
CanvasRenderingContext2D.drawImage
の引数としてImageBitmap
を使用します。
最近のChromeとFirefoxではうまく動作しますが、Safari 9.1.3には明らかにcreateImageBitmap
機能がありません。 私はSafariで動作する方法で、上記のようなことをどうしたらよいですか?
イメージの低コストエンコーディングはありますか?data:image/png…
の作成には至りません。バイト配列をdrawImage
に送ることができる何か他の方法がありますか?
ところでhttp://caniuse.com/は現在この機能をリストしていません。この機能が監視されているかどうかを確認するには、a feature requestがあります。
あなたは私の現在のアプローチのためのコードを確認したい場合は、ここで私の労働者の関連部分である:
var buffer = new ArrayBuffer(bufferSize);
var asm = Module.asm(self, {}, buffer);
var imgBytes = new Uint8ClampedArray(buffer, offset);
var imgData = new ImageData(imgBytes, width, height);
createImageBitmap(imgData).then(function(bmp) { // Not available on Safari!
postMessage(bmp, [bmp]);
});
、ここで対応するGUIスレッドコードは:
var worker = new Worker(‹url of worker›);
worker.onmessage = function(msg) {
var img = msg.data;
context2d.drawImage(img, 0, 0, width, height);
};
実際のコード化されていないコードはthis GitHub pull requestにありますが、手元の質問とは関係のない他の多くのものがあります。
で
ImageData
オブジェクトを作成する必要はありません。したがって、型付き配列に格納されている間は、生のピクセルデータではありません。このアプローチを再現するには、ピクセルデータをPNGエンコードする必要があります。これには時間がかかり、PNGヘッダー、行ヘッダーの挿入、最小限のデフレートエンコード用のいくつかのライブラリまたは自己記述コードが必要です。非圧縮ストアメソッドのみを使用して)。それでも、それは実行可能な選択肢かもしれません、特に何もうまくいけば、ありがとう! – MvG@MvG代わりに 'imgData'の' buffer'を 'postMessage'のメインスレッドに転送し、' .putImageData'を '.drawImage'に置き換えることもできます。最新の記事を参照してください。 – guest271314
私が正しく従っていれば、あなたの最後の部分では、作業者にImageDataオブジェクトを作成する必要はありません(https://jsfiddle.net/Kaiido/234ekx4b/) – Kaiido