javacript Uint8Array
に保存されているPNG画像をレンダリングしようとしています。Javascript:データURIなしのキャンバス要素にUint8Arrayとして保存されたPNGをレンダリングする
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関数は決して(私はクロームで設定したブレークポイントを持っていたし、それは単に打つことはありません)を実行しなかったことが判明:私はもともと試したコードは以下の通りでした。データURIの代わりにURLにsrcを設定すると、正しく動作することがわかりました。しかし、いくつかの制約のために、画像の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);
この関数は謝罪ので、適切な信用を与えないためのインスピレーションに、どのように機能するかを理解していないことに注意してください。ゆっくりとこの事で離れて打撃ながら
はまた、私はクロームSECURITY_ERR: DOM Exception 18
でエラーに遭遇しました。 ImageがdrawImageを使用してキャンバスに読み込まれるとすぐに、それはいくつかの追加の回避策なしで取得することはできません。トピックのChromium Blog postが特に役に立ちました
あなたは 'putImageData()'を調べましたか? – David
ちょうど好奇心のため:画像データはどのように配列に入ったのですか? – closure
@David:少し調べましたが、PNGでエンコードされた画像データではなく、生の画像データであることを理解しています。 – zashu