将捕获的png保存为arraybuffer

时间:2013-12-19 20:44:30

标签: javascript canvas base64 dropbox arraybuffer

我正在尝试将图像保存到Dropbox,并且无法正确转换。我有一个img(使用this示例捕获)并且我想将它存储到接受ArrayBuffer的dropbox(示例here

这是我发现应该进行两次转换的代码,首先是base64,然后是ArrayBuffer

    function getBase64Image(img) {
    // Create an empty canvas element
    var canvas = document.createElement("canvas");
    canvas.width = img.width;
    canvas.height = img.height;

    // Copy the image contents to the canvas
    var ctx = canvas.getContext("2d");
    ctx.drawImage(img, 0, 0);

    // Get the data-URL formatted image
    // Firefox supports PNG and JPEG. You could check img.src to
    // guess the original format, but be aware the using "image/jpg"
    // will re-encode the image.
    var dataURL = canvas.toDataURL("image/png");

    return dataURL.replace(/^data:image\/(png|jpg);base64,/, "");
}

function base64ToArrayBuffer(string_base64) {
    var binary_string = window.atob(string_base64);
    var len = binary_string.length;
    var bytes = new Uint8Array(len);
    for (var i = 0; i < len; i++) {
        var ascii = binary_string.charCodeAt(i);
        bytes[i] = ascii;
    }
    return bytes.buffer;
}

像这样开始保存

     var img = $('#show-picture')[0];
    var data = base64ToArrayBuffer( getBase64Image(img));
    dropbox.client.writeFile(moment().format('YYYYMMDD-HH-mm-ss')+'.png', data, function (error, stat) {
        if (error) {
            return dropbax.handleError(error);
        }
        // The image has been succesfully written.
    });

问题是我保存了一个损坏的文件,并且对于什么是错误有点困惑。

* 编辑*

这是原始文件的链接 https://www.dropbox.com/s/ekyhvu2t6d8ldh3/original.PNG而且这里已经腐败了。 https://www.dropbox.com/s/f0oevj1z33brpur/20131219-22-23-14.png

我正在使用此版本的dropbox.js://cdnjs.cloudflare.com/ajax/libs/dropbox.js/0.10.2/dropbox.min.js

正如您所看到的,损坏的是23,3KB与32,6 KB相比略大一些 谢谢你的帮助

Larsi

1 个答案:

答案 0 :(得分:0)

将我的评论移到答案中,因为它似乎适用于最新的Datastore JS SDK,但可能不适用于dropbox.js 0.10.2。


什么浏览器和什么版本的Dropbox库?而且保存的图像有什么问题? (我假设“损坏”你的意思是它不会在你正在使用的任何工具中打开......还有更多提示吗?文件大小合理吗?)我刚做了一个非常相似的测试(toDataURL,atob和Uint8Array) )使用OS X上的Chrome和dropbox.com/static/api/dropbox-datastores-1.0-latest.js,它似乎有效。