javascript に保存されている PNG 画像をレンダリングしようとしていますUint8Array
。私が最初に試したコードは次のとおりです。
var imgByteStr = String.fromCharCode.apply(null, this.imgBytes);
var pageImg = new Image();
pageImg.onload = function(e) {
// Draw onto the canvas
canvasContext.drawImage(pageImg, 0, 0);
};
// Attempt to generate the Data URI from the binary
// 3rd-party library adds toBase64() as a string function
pageImg.src="data:image/png;base64,"+encodeURIComponent(imgByteStr.toBase64());
しかし、何らかの理由で onload 関数が実行されていないことがわかりました (Chrome にブレークポイントを設定したのに、まったくヒットしませんでした)。src を Data URI ではなく URL に設定すると、正しく機能することがわかりました。ただし、いくつかの制約により、画像の URL を直接参照することはできませんUInt8Array
。
また、少し複雑なことに、これらのイメージのサイズはメガバイトになる場合があります。私が読んだことによると、非常に大きな画像にデータ URI を使用しようとすると、互換性の問題があります。このため、私はそれらを利用することを非常にためらっています。
したがって、問題は、データ URI を使用したり、画像 URL を直接参照したりせずに、このバイト配列を PNG としてキャンバス コンテキストにレンダリングするにはどうすればよいかということです。
また、関数を使用して画像データを直接操作するために、次のようなものを使用してみましたputImageData
。この機能がどのように機能するかを 100% 理解しているわけではないことに注意してください。
var imgdata = canvasContext.createImageData(this.baseHeight, this.baseWidth);
var imgdatalen = imgdata.data.length;
for(var i=0; i<imgdatalen; i++) {
imgdata.data[i] = _this.imgBytes[i];
}
canvasContext.putImageData(imgdata, 0, 0);
タブを閉じたブログから削除されたので、適切なクレジットを与えなかったことをお詫びします。
また、このことをゆっくりと叩いているうちに、 Chrome でエラーが発生しましたSECURITY_ERR: DOM Exception 18
。drawImage を使用してイメージがキャンバスにロードされるとすぐに、いくつかの追加の回避策なしでは取得できないことが判明しました。このトピックに関する Chromium ブログの投稿は特に役に立ちました