画像をサーバーに送信できるように、画像を Base64 文字列に変換する必要があります。
これ用の JavaScript ファイルはありますか? そうでなければ、どうすれば変換できますか?
ベストアンサー1
選択できるアプローチは複数あります。
1. アプローチ: FileReader
画像をblobとして読み込むXMLHttpリクエストそして、ファイルリーダーAPI(データURLとして読み込み())に変換しますデータURL:
function toDataURL(url, callback) {
var xhr = new XMLHttpRequest();
xhr.onload = function() {
var reader = new FileReader();
reader.onloadend = function() {
callback(reader.result);
}
reader.readAsDataURL(xhr.response);
};
xhr.open('GET', url);
xhr.responseType = 'blob';
xhr.send();
}
toDataURL('https://www.gravatar.com/avatar/d50c83cc0c6523b4d3f6085295c953e0', function(dataUrl) {
console.log('RESULT:', dataUrl)
})
このコード例はWHATWGを使用して実装することもできます。フェッチAPI:
const toDataURL = url => fetch(url)
.then(response => response.blob())
.then(blob => new Promise((resolve, reject) => {
const reader = new FileReader()
reader.onloadend = () => resolve(reader.result)
reader.onerror = reject
reader.readAsDataURL(blob)
}))
toDataURL('https://www.gravatar.com/avatar/d50c83cc0c6523b4d3f6085295c953e0')
.then(dataUrl => {
console.log('RESULT:', dataUrl)
})
これらのアプローチ:
- 圧縮性が向上する
- 他のファイル形式にも適用可能
ブラウザのサポート:
ヒント:ローカルファイルを変換するには、ライブサーバー変換する画像を含むフォルダーを起動したら、ブラウザーで URL を開き、開発者コンソールを使用して画像を Base 64 に変換できます。
2. アプローチ: Canvas (レガシーブラウザ向け)
画像を Image-Object に読み込み、汚染されていないキャンバスに描画し、キャンバスを dataURL に変換します。
function toDataURL(src, callback, outputFormat) {
var img = new Image();
img.crossOrigin = 'Anonymous';
img.onload = function() {
var canvas = document.createElement('CANVAS');
var ctx = canvas.getContext('2d');
var dataURL;
canvas.height = this.naturalHeight;
canvas.width = this.naturalWidth;
ctx.drawImage(this, 0, 0);
dataURL = canvas.toDataURL(outputFormat);
callback(dataURL);
};
img.src = src;
if (img.complete || img.complete === undefined) {
img.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
img.src = src;
}
}
toDataURL(
'https://www.gravatar.com/avatar/d50c83cc0c6523b4d3f6085295c953e0',
function(dataUrl) {
console.log('RESULT:', dataUrl)
}
)
サポートされている入力形式:
image/png
、、、、、、、、、、、、image/jpeg
image/jpg
image/gif
image/bmp
image/tiff
image/x-icon
image/svg+xml
image/webp
image/xxx
サポートされている出力形式:
image/png
、、 (image/jpeg
クロームimage/webp
)
ブラウザのサポート:
- http://caniuse.com/#feat=canvas
-
Internet Explorer 10 (Internet Explorer 10 は同じオリジンの画像でのみ動作します)
3. アプローチ: ローカルファイルシステムからの画像
ユーザーのファイルシステムから画像を変換したい場合は、別の方法を取る必要があります。ファイルリーダーAPI:
function encodeImageFileAsURL(element) {
var file = element.files[0];
var reader = new FileReader();
reader.onloadend = function() {
console.log('RESULT', reader.result)
}
reader.readAsDataURL(file);
}
<input type="file" onchange="encodeImageFileAsURL(this)" />