ファイルシステムに画像を書き込み、それを読み込んで表示する次のコードがあります。ファイルシステム API を試す前に、base64 イメージ全体を src 属性にロードすると、イメージが正常に表示されました。問題は、画像が大きくなる可能性があるため、5MB の画像をいくつか追加すると、メモリが不足することです。そのため、それらを tmp ストレージに書き込み、URL のみを src 属性に渡すことにしました。問題は、何も表示されないことです。
最初は URL に問題があるのではないかと考えていましたが、ファイルシステム ディレクトリに移動し、参照している画像を見つけて実際のバイナリ イメージに物理的に置き換え、置き換えた画像と同じ名前に変更しました。これは問題なく機能し、画像が正しく表示されるので、URL は適切に表示されます。
私が到達できる唯一の結論は、画像の書き込みが何らかの形で間違っているということです。特に、ブロブが作成されるポイントです。私はブロブ API を調べましたが、見逃した可能性のあるものは何も表示されませんが、他のすべての人に対して機能しているように見えるため、明らかに何か間違っています。
余談ですが、画像を IndexedDB に保存し、createObjectURL を使用して画像を表示しようとしましたが、URL は正しいように見えますが、画面には何も表示されません。したがって、ファイルシステム API での試行。BLOB の作成は、どちらの場合も同じで、同じデータを使用します。
前述のように、ソース データは base64 でエンコードされた文字列です。はい、未加工のbase64データをブロブに保存しようとしましたが(プレフィックスの有無にかかわらず)、どちらも機能しませんでした。
その他の情報 - Linux Ubuntu の Chrome バージョン 28
//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">
誰かが何らかのガイダンスを提供できない限り、私は少し立ち往生しています...
アップデート
B64encoder/decoder と 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.encode 関数が使用されていないためです...
結果のファイルはファイルシステム TEMPORARY にあり、比較のためにオンラインの base64 エンコーダーを実行しましたが、結果はまったく異なります。問題は、ファイルシステムの一時ストレージにある間、イメージは正確なイメージであるはずですか、それともファイルシステム API だけが理解できる「何か」で埋められているのでしょうか? 元の PNG をファイル システム ディレクトリに配置し、画像が正しく表示されたことを思い出してください。これは、画像に関するメタデータ (ファイル名など) が他の場所に保持されていることを示している傾向があります...
これを実際に実装している人は、画像がファイルシステムに画像として保存されているのか、それとも追加のメタデータが埋め込まれているのかを確認できますか?