以前にcanvasの内容を画像に変換する記事を投稿しましたが、変換時のファイル形式でwebpを指定することもできるので、ローカルの画像をwebp形式に変換する仕組みを実装してみます。
対応ブラウザ
今回使用するtoDataURL()は主要なブラウザで対応していますが、webp形式を指定する場合はSafariで対応していないようです。
指定した形式に対応していない場合、png形式での書き出しになります。
今回のサンプルではSafariは考慮に含めていません。(ファイル拡張子は.webpで、中身はpng形式の画像が出力されます。)
サンプルコード
ローカルから画像を選択する形にするため、input type=”file” と変換結果を出力する#result を配置します。
<input type="file" id="file" accept=".jpg,.jpeg,.png" multiple /> <ul id="result"></ul>
inputには複数選択できるようにmultipleと、acceptでjpgとpngのファイルのみ受け付けるように設定しています。
次にinputで選択した画像をwebpに変換する処理です。
const quality = 0.8;
let reader = [];
let fileData = [];
// ファイルが選択されたとき
document.getElementById('file').addEventListener('change', function(e) {
reader = [];
fileData = [];
const fileLength = e.target.files.length;
for (let i = 0; i < e.target.files.length; i++) {
reader[i] = new FileReader();
// ファイルの読み取り失敗時の処理
reader[i].onerror = function() {
alert('ファイル読み取りに失敗しました');
}
// ファイルの読み取り成功時の処理
reader[i].onload = function() {
const data = reader[i].result;
const size = e.target.files[i].size;
let names = e.target.files[i].name.split('.');
names.pop();
const name = names.join('.');
fileData.push({
data: data,
name: name
});
// 全てのファイル読み取り完了後、変換処理実行
if(fileData.length >= fileLength) {
convert_image();
}
}
// ファイルの読み取り実行
reader[i].readAsDataURL(e.target.files[i]);
}
});
function convert_image() {
for (let i = 0; i < fileData.length; i++) {
// canvasと読み込む画像の生成
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
const img = document.createElement('img');
// 変換前の画像読み込み後の処理
img.addEventListener('load', function(e) {
// 画像の実サイズ取得してcanvas内に描画
fileData[i].width = img.naturalWidth;
fileData[i].height = img.naturalHeight;
canvas.width = fileData[i].width;
canvas.height = fileData[i].height;
ctx.drawImage(img, 0, 0, fileData[i].width, fileData[i].height);
// canvasの内容をwebp形式で保存
const data = canvas.toDataURL('image/webp', quality);
// ダウンロードリンクの生成
const a = document.createElement('a');
a.href = data;
a.setAttribute('download', fileData[i].name+'.webp');
a.innerText = fileData[i].name+'.webp';
const li = document.createElement('li');
li.appendChild(a);
document.getElementById('result').appendChild(li);
});
img.src = fileData[i].data;
}
}
これでwebpに変換してダウンロードできるようになりました。
webpに変換するデモページ
画質やサイズの調整が必要な場合、1行目の0.8を0〜1の範囲で変更することで調整できます。
コメントが承認されるまで時間がかかります。