gpt4 book ai didi

javascript - 将 Data-URL 转换为有效的字节字符串

转载 作者:行者123 更新时间:2023-11-30 06:33:46 25 4
gpt4 key购买 nike

我试图让用户保存已渲染到 Canvas 上的图像。可能有多个图像,我希望用户能够将所有图像作为单个 tar 文件一次下载。我正在尝试编写代码来生成这个 tar 文件。我已经完成了大部分工作,但是当 tar 文件最后下载到我的计算机时,我发现组成 png 文件的一些二进制数据已损坏。相关代码如下:

var canvBuffer = $('<canvas>').attr('width', canvasWidth).attr('height', canvasHeight);
var ctxBuffer = canvBuffer[0].getContext('2d');

imgData.data.set(renderedFrames[0]);
ctxBuffer.putImageData(imgData,0,0);

var strURI = canvBuffer[0].toDataURL();
var byteString = atob(decodeURIComponent(strURI.substring(strURI.indexOf(',')+1)));

toTar([byteString]);

function toTar(files /* array of blobs to convert */){
var tar = '';

for (var i = 0, f = false, chkSumString, totalChkSum, out; i < files.length; i++) {

f = files[i];
chkSumString = '';

var content = f;


var name = 'p1.png'.padRight('\0', 100);
var mode = '0000664'.padRight('\0', 8);
var uid = (1000).toString(8).padLeft('0', 7).padRight('\0',8);
var gid = (1000).toString(8).padLeft('0', 7).padRight('\0',8);
var size = (f.length).toString(8).padLeft('0', 11).padRight('\0',12);

var mtime = '12123623701'.padRight('\0', 12); // modification time
var chksum = ' '; // enter all spaces to calculate chksum
var typeflag = '0';
var linkname = ''.padRight('\0',100);
var ustar = 'ustar \0';
var uname = 'chris'.padRight('\0', 32);
var gname = 'chris'.padRight('\0', 32);

// Construct header with spaces filling in for chksum value
chkSumString = (name + mode + uid + gid + size + mtime + chksum + typeflag + linkname + ustar + uname + gname).padRight('\0', 512);


// Calculate chksum for header
totalChkSum = 0;
for (var i = 0, ch; i < chkSumString.length; i++){
ch = chkSumString.charCodeAt(i);
totalChkSum += ch;
}

// reconstruct header plus content with chksum inserted
chksum = (totalChkSum).toString(8).padLeft('0', 6) + '\0 ';
out = (name + mode + uid + gid + size + mtime + chksum + typeflag + linkname + ustar + uname + gname).padRight('\0', 512);
out += content.padRight('\0', (512 + Math.floor(content.length/512) * 512)); // pad out to a multiple of 512
out += ''.padRight('\0', 1024); // two 512 blocks to terminate the file
tar += out;
}

var b = new Blob([tar], {'type': 'application/tar'});
window.location.href = window.URL.createObjectURL(b);

}

我将之前渲染的帧放在未渲染的 Canvas 上,并使用 Canvas 的 toDataURL() 方法对具有 Base64 编码的帧的编码 png 版本进行处理。接下来,我使用 atob 将其转换为字节字符串,以便可以将其附加到我生成的 tar 文件的内容中。

当我在十六进制编辑器中查看文件时,我的 tar header 是正确的,但 png 的内容不太正确。 ASCII 内容看起来正常,但二进制数据被打乱了。

如能提供任何帮助,我们将不胜感激。谢谢。

附言

我附上了我看过的相关帖子的链接。他们很有帮助,但我还没有看到任何可以完全解决我的问题的东西。谢谢。

Convert Data URI to File then append to FormData , 和 Data URI to Object URL with createObjectURL in chrome/ff

最佳答案

好的,我已经解决了这个问题。问题出在 toTar 末尾的 Blob 构造函数。向它传递一个字符串导致 blob 将我的数据视为 UTF-8 而不是二进制,我需要将它传递给 arrayBuffer 以获得无符号整数数组。下面是我的解决方案

  var byteArray = new Uint8Array(tar.length);
for (var b = 0; b < tar.length; b++) {
byteArray[b] = tar.charCodeAt(b);
}

var b = new Blob([byteArray.buffer], {'type': 'application/tar'});
window.location.href = window.URL.createObjectURL(b);

我应该重写 toTar 以在 Uint8Array 中构建文件并消除最后转换的需要,但这充分回答了我的问题并希望对其他人有所帮助。谢谢。

关于javascript - 将 Data-URL 转换为有效的字节字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15993661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com