簡體   English   中英

Uint8ClampedArray替代或使Uint8Array產生一個鉗位的字節值字符串

[英]Uint8ClampedArray alternative or make Uint8Array produce a clamped string of byte values

我正在研究這個真正的頭顱!

我成功地將字節值添加到Uint8ClampedArray並使用該數組使用此函數生成字節字符串:

this.utf8ArrayToStr = function(array) {
        var s = '';
        for (var i = 0; i < array.length; i++) {
            s += String.fromCharCode(array[i]);
        }
        return s;
};

這可以處理並成功生成正確的字節序列。

問題是並非所有瀏覽器都支持Uint8ClampedArray,我特別需要它才能在Android瀏覽器上運行。

我嘗試使用標准的Uint8Array,但它會在結果字符串中產生額外的字節值,從而導致錯誤的行為。

我也在這里找到了一個小墊片,但它沒有用,再次產生額外的輸出: https//gist.github.com/gengkev/2295355

無論如何我可以讓Uint8Array充當Uint8ClampedArray,或者更具體地說,在上面的函數中生成字符串時鉗位值?

更新:看起來我正在使用標准陣列,但仍有一些混亂的字符導致問題。

我認為你不應該使用Uint8Array來存儲你的數據 - 它根本不像Uint8ClampedArray那樣工作。 例如:

a = new Uint8Array(1);
b = new Uint8ClampedArray(1);
a[0] = 256;
b[0] = 256;

a[0] === 0;    // true
b[0] === 255;  // true

我只是使用一個常規數組(如果這是一個選項)並在將值存儲到它時將值鉗位,或者當您讀取它們以生成如下所示的字符串時:

s += String.fromCharCode(Math.max(0, Math.min(255, array[i])));

WhatWG推薦使用Uint8ClampedArray來存儲畫布像素數據。

但是,各種瀏覽器使用Uint8ClampedArray(或不使用)取決於他們是否實現了WhatWG建議。

因此,更多的跨瀏覽器解決方案是使用.getImageData從畫布中拉出一個數組,然后根據需要操作該數組。 這樣你知道你正在使用兼容陣列。

var imageData = context.getImageData(0,0,canvas.width,canvas.height);

var data = imageData.data;  // this array is always compatible with its browser.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM