我檢索畫布imagedata中的像素,我正在做很多。畫布imagedata多個像素插入
我認爲插入和從畫布imagedata檢索是在cpu時間昂貴,所以我想盡可能少的那些。
切割的一種方法是製作一個單一的插件,它可以在一個序列中插入多個像素,但到目前爲止,我還沒有看到如何做到這一點。到目前爲止,我看到的所有例子都只能檢索並插入一個像素。
所以問題是, 爲了加快畫布imagedata像素操縱,我該如何插入/檢索多個像素同時?
我檢索畫布imagedata中的像素,我正在做很多。畫布imagedata多個像素插入
我認爲插入和從畫布imagedata檢索是在cpu時間昂貴,所以我想盡可能少的那些。
切割的一種方法是製作一個單一的插件,它可以在一個序列中插入多個像素,但到目前爲止,我還沒有看到如何做到這一點。到目前爲止,我看到的所有例子都只能檢索並插入一個像素。
所以問題是, 爲了加快畫布imagedata像素操縱,我該如何插入/檢索多個像素同時?
檢索像素緩衝區時,只需選擇一個更大的區域:
var imageData = ctx.getImageData(x, y, width, height);
^^^^^^^^^^^^ not limited to one
現在你的數據緩衝區將包含給定區域的所有像素。爲了讓整個畫布:
var imageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
調整他們放回到同一位置:
ctx.putImageData(imageData, x, y);
就大功告成了。
請記住,每個像素由四個字節(RGBA)組成。爲了解決一個更大的緩衝區,你可以這樣做:
function getPixelIndex(x, y) {
return (y * width + x) * 4; // width used when getting buffer
}
提示:
createImageData()
而不是getImageData()
開始使用空緩衝區。如果您的像素顏色數據或多或少是靜態的,您可以使用Uint32Array
而不是Uint8ClampedArray
來更新緩衝區。你得到一個32位版本像這樣得到imageData
後:
var buffer32 = new Uint32Array(imageData.data.buffer);
您的新buffer32
將指向相同的底層字節的緩衝區所以沒有顯著的內存開銷,但它可以讓你閱讀和寫32位值而不是8位。請注意,字節順序(通常)是小端,因此要將字節排序爲ABGR。然後像以前一樣,在需要更新時請致電ctx.putImageData(imageData, x, y);
。