5

我正在使用 websocket 以 blob 形式发送 Jpeg 图像。我已经压缩(gzipped)了 blob,但我找不到使用 JavaScript 解压缩它的方法。有谁知道怎么做?

这是我用来读取 blob 并将其转换为 base64 字符串的代码:

var r = new FileReader();

r.onload = function(){
    draw(btoa(r.result));
};
r.readAsBinaryString(e.data);

draw()函数基本上使用 base64 字符串将图像绘制到 HTML5 画布上。

我发现这个库可以扩充字符串,但它不支持 blob。(据我所知/已经测试过)如果有人知道一种方法,我会很高兴。:) 谢谢!

4

2 回答 2

3

我为我的粒子系统编辑器做了一个非常相似的事情,它支持读取 Cocos2D plist 文件。plist文件中是纹理数据,这是一个用gzip压缩然后转换为base64的png。这是我的做法:

var input = 'byu9g1RZpINUpVtoKoiKIqJYoris...'; // really long string

// from base64 to ascii binary string
var decodedAsString = atob(input);

// ascii string to bytes in gzipped format
var data = this._binaryStringToArray(decodedAsString);

// raw, uncompressed, binary image data into an array using gzip.js
var uncompressed = require('gzip-js').unzip(data);

// now take the raw uncompressed png and convert it
// back to base64 to use it as a data url
var asString = this._arrayToBinaryString(uncompressed);
var encodedForDataUrl = btoa(asString);

var img = new Image();
img.src = encodedForDataUrl;

我正在使用gzip.js来完成繁重的工作。你可以在这里看到这一切,你可以在这里下载一些 plist 。BoilingFoam.plist 将起作用,只需将其加载到“导入/导出”部分即可。

在上面的代码中,我调用了两个方法,它们是:

 _binaryStringToArray: function(binaryString) {
        var data = [];

        for (var i = 0; i < binaryString.length; ++i) {
            data[i] = binaryString.charCodeAt(i);
        }

        return data;
    },

    _arrayToBinaryString: function(array) {
        var str = '';
        for (var i = 0; i < array.length; ++i) {
            str += String.fromCharCode(array[i]);
        }
        return str;
    },

整个shebang都在这里

于 2013-01-13T22:45:41.557 回答
1

获取一个 byteArray,您可以使用以下方法对其进行解码:http pako: //jsfiddle.net/9yH7M/

于 2014-03-26T23:55:40.250 回答