使用chrome文件系统toURL未显示图像
Image not showing using chrome filesystem toURL
我有以下代码将图像写入文件系统,并读回以供显示。在尝试使用文件系统API之前,我将整个base64映像加载到src属性中,该映像显示良好。问题是图像可能很大,所以如果你添加几个5MB的图像,就会耗尽内存。所以我想我应该把它们写到tmp存储中,只把URL传递到src属性中。问题是,什么都没有显示。
起初我认为URL可能有问题,但后来我进入文件系统目录,找到了它所指的映像,并用实际的二进制映像对其进行了物理替换,并将其重命名为与替换的映像相同的映像。这很好,图像显示正确,所以URL看起来不错。
我能得出的唯一结论是,图像的书写在某种程度上是错误的,尤其是在创建斑点的地方。我浏览了blob API,看不到我可能遗漏的任何内容,但我显然做错了什么,因为它似乎对其他人都有效。
顺便说一句,我还尝试将图像存储在IndexedDB中,并使用createObjectURL来显示图像——同样,尽管URL看起来正确,但屏幕上什么都没有显示。因此,在文件系统API上进行了尝试。blob的创建在这两种情况下都是相同的,具有相同的数据。
正如我提到的,源数据是一个base64编码的字符串。是的,我也尝试将原始base64数据存储在blob中(有前缀和没有前缀),但这也不起作用。
其他信息-chrome版本28,在linux Ubuntu 上
//strip the base64 `enter code here`stuff ...
var regex = /^data.+;base64,/;
if (regex.test(imgobj)) { //its base64
imgobj = imgobj.replace(regex,"");
//imgobj = B64.decode(imgobj);
imgobj = window.atob(imgobj);
} else {
console.log("it's already :", typeof imgobj);
}
// store the object into the tmp space
window.requestFileSystem(window.TEMPORARY, 10*1024*1024, function(fs) {
// check if the file already exists
fs.root.getFile(imagename, {create: false}, function(fileEntry) {
console.log("File exists: ", fileEntry);
callback(fileEntry.toURL(), fileEntry.name);
//
}, function (e) { //file doesn't exist
fs.root.getFile(imagename, {create: true}, function (fe) {
console.log("file is: ", fe);
fe.createWriter(function(fw){
fw.onwriteend = function(e) {
console.log("write complete: ", e);
console.log("size of file: ", e.total)
callback(fe.toURL(), fe.name);
};
fw.onerror = function(e) {
console.log("Write failed: ", e.toString());
};
var data = new Blob([imgobj], {type: "image/png"});
fw.write(data);
}, fsErrorHandler);
}, fsErrorHandler);
});
// now create a file
}, fsErrorHandler);
回调的输出为:
<img class="imgx" src="filesystem:file:///temporary/closed-padlock.png" width="270px" height="270px" id="img1" data-imgname="closed-padlock.png">
除非有人能提供一些指导,否则我有点停滞不前。。。
更新
我运行了一个测试,用B64编码器/解码器和atob/btoa-对base64图像进行编码和解码
console.log(imgobj); // this is the original base64 file from the canvas.toDataURL function
/* B64 is broken*/
B64imgobjdecode = B64.decode(imgobj);
B64imgobjencode = B64.encode(B64imgobjdecode);
console.log(B64imgobjencode);
/* atob and btoa decodes and encodes correctly*/
atobimgobj = window.atob(imgobj);
btoaimgobj = window.btoa(atobimgobj);
console.log(btoaimgobj);
结果表明,btoa/atob函数可以正常工作,但B64不能正常工作——可能是因为原始编码没有使用B64编码函数。。。
在文件系统TEMPORARY中生成的文件中,我运行了一个在线base64编码器进行比较,结果完全不同。所以问题是,在文件系统临时存储中,映像应该是一个精确的映像,还是用只有文件系统API才能理解的"东西"填充?记住,我把原始PNG放在文件系统目录中,图像显示正确,这往往表明图像的元数据(例如文件名)保存在其他地方。。。
有工作实现的人能确认图像是作为图像存储在文件系统中,还是用额外的元数据填充吗?
因此,为了回答我自己的问题-核心问题是base64编码/解码-从那以后,我将其更改为使用ajax和responseTypes之类的东西,如arraybuffer和blob,一切都开始工作了。为了回答问题的最后一部分,这就是我所发现的——在文件系统tmp存储中,是的,该文件应该是一个精确的二进制副本——在chrome和phonegap中验证了这一点。
- 从桌面读取python文件时高亮显示代码
- 使用JS如何动态更改显示的html文件中的文本背景颜色
- 如何在生成下载文件时显示加载动画
- React重新渲染但未显示正确的组件
- nodejs-expressjs上传图像并显示它们
- 使用JSP从服务器检索和显示图像
- 音频控件在mouseover上显示,在mouseout上淡出
- 让文本输入幻灯片显示输入时的新文本输入?然后向后滑动
- 使用电话间隙在Android应用程序中显示SQL Lite的数据
- 显示5秒后隐藏潜水
- 画廊图像未显示
- 不显示带有本地json文件数据的谷歌地图脚本
- 如何将json数据显示为html
- 谷歌地图不是以HTML显示,而是在JS Fiddle上工作
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- 高亮显示时编辑文本大小和颜色
- 有时数据是't显示在浏览器中
- 当鼠标悬停在文本中的单词上时显示警报
- 角度图表;t显示在我的页面中
- 显示图工具提示显示x轴的最后日期值,而不是当前值