ローカルでWEBP一括変換!WEBP一括変換ツール(無料)の紹介
2026.01.24
画像のwebp化、ウェブサイトの必須要素なのはわかってるけれど、ちょっとめんどくさいですよね。
もちろんfigmaとかPhotoshopでもwebpでの出力はできる。もちろんPowerShellなどのシェルスクリプトでも出来る。
だけど毎回開かないといけない。これはこれでめんどくさい。
もちろんオンラインツールとかもあるけれど、セキュリティを考えるとどうも気が引ける。
そこで作りました。
ウェブサーバーとか不要です。ブラウザで開くだけで安心。
WEBP一括変換ツールダウンロード(無料)
もちろん広告とか何もなし。純粋なhtmlとjsですので、ご自由にご利用ください。
使い方
- ダウンロードしたファイルを、ブラウザで開く
- webpに変換したい画像をまとめてドラッグ・ドロップ
- zip形式でダウンロードされます
ブラウザでの開き方
- ChromeやEdgeなどいつも使っているブラウザを開く。YahooでもGoogleでも何が開いてあってもいい。
- ダウンロードしたファイルのアイコンをその開いているページの上にドラッグ・ドロップ
- 勝手に新しいタブが開いて、利用できるようになります。
利用制限・お約束
- 個人だろうが、商用だろうが、用途は問いません。
- 自由に改変してください。
- 記事で紹介する場合、だれかに教える場合は、このページのことを教えてください。
- 利用などは自己責任です。このファイルやソースコードで何かあっても知りません。
- 心配な人はソースコードをそのままコピペして、ご利用ください。
ソースコード
本ツールは、以下のようになっています。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Acrocraft WebP Converter</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
<style>
body { font-family: 'Helvetica Neue', sans-serif; background: #1a1a1a; color: #fff; text-align: center; padding: 40px; }
#drop-zone { border: 2px dashed #444; border-radius: 20px; padding: 80px; background: #2a2a2a; cursor: pointer; transition: 0.3s; }
#drop-zone.hover { border-color: #007bff; background: #333; }
.info { margin-top: 20px; color: #888; font-size: 0.9em; }
#status { margin-top: 20px; font-weight: bold; color: #00ffcc; }
</style>
</head>
<body>
<h1>WebP 変換スタジオ</h1>
<p>統一規格:Quality 0.75 / ZIP一括出力</p>
<div id="drop-zone">ここに複数の画像をまとめてドロップ</div>
<div id="status"></div>
<div class="info">※画像はサーバーに送信されず、ブラウザ内のみで安全に処理されます。</div>
<script>
const dropZone = document.getElementById('drop-zone');
const status = document.getElementById('status');
dropZone.ondragover = () => { dropZone.classList.add('hover'); return false; };
dropZone.ondragleave = () => { dropZone.classList.remove('hover'); return false; };
dropZone.ondrop = async (e) => {
e.preventDefault();
dropZone.classList.remove('hover');
const files = Array.from(e.dataTransfer.files).filter(f => f.type.match('image.*'));
if (files.length === 0) return;
status.innerText = `${files.length}枚の画像を調律中...`;
const zip = new JSZip();
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
for (let file of files) {
const img = await new Promise(resolve => {
const reader = new FileReader();
reader.onload = (re) => {
const i = new Image();
i.onload = () => resolve(i);
i.src = re.target.result;
};
reader.readAsDataURL(file);
});
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0);
// WebP変換 (Quality 0.75)
const dataUrl = canvas.toDataURL('image/webp', 0.75);
const base64Data = dataUrl.split(',')[1];
// ZIPにファイルを追加
const fileName = file.name.replace(/\.[^/.]+$/, "") + ".webp";
zip.file(fileName, base64Data, {base64: true});
}
// ZIP生成とダウンロード
const content = await zip.generateAsync({type: "blob"});
const link = document.createElement('a');
link.href = URL.createObjectURL(content);
link.download = `converted_webp_${new Date().getTime()}.zip`;
link.click();
status.innerText = `${files.length}枚の変換が完了しました!`;
};
</script>
</body>
</html>
簡単な調整方法
58行目の値を変更することで、クオリティの変更が可能です。
const dataUrl = canvas.toDataURL('image/webp', 0.75);
クオリティの仕組み(Canvas API)
toDataURL(type, quality) の第2引数は、0.0 から 1.0 までの数値で指定します。
- 1.0 (最高品質): ほぼ劣化なし。ただしファイルサイズは大きくなります。
- 0.92 (標準): ブラウザ(Chromeなど)のデフォルト値。
- 0.75 (瑞宜さんの統一規格): 画質の劣化が目立たず、ファイルサイズを劇的に削れる「Web制作の黄金比」。
- 0.1 (最低品質): モザイクのような荒い画像になりますが、サイズは最小です。
Googleのエンジニアが推奨するWebPの標準的な圧縮設定(cwebp)でも、デフォルトのクオリティは 75 に設定されています。
また、クオリティを簡単に変更したい方は、クオリティ変更可能WEBP一括変換ツールをご利用ください。
クオリティ変換可能WEBP一括変換ツール
ソースコード
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Acrocraft WebP Studio</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
<style>
body { font-family: 'Helvetica Neue', sans-serif; background: #1a1a1a; color: #fff; text-align: center; padding: 40px; }
#drop-zone { border: 2px dashed #444; border-radius: 20px; padding: 60px; background: #2a2a2a; cursor: pointer; transition: 0.3s; margin-bottom: 20px; }
#drop-zone.hover { border-color: #00ffcc; background: #333; }
/* 調律パネルのスタイル */
.controls { background: #333; padding: 20px; border-radius: 10px; display: inline-block; margin-bottom: 20px; }
input[type=range] { width: 200px; cursor: pointer; vertical-align: middle; }
.q-value { font-size: 1.5em; font-weight: bold; color: #00ffcc; margin-left: 10px; vertical-align: middle; }
#status { font-weight: bold; color: #00ffcc; min-height: 1.2em; }
</style>
</head>
<body>
<h1>WebP 変換スタジオ</h1>
<div class="controls">
<label>Quality :</label>
<input type="range" id="quality-slider" min="0.05" max="1.0" step="0.05" value="0.75">
<span id="quality-display" class="q-value">0.75</span>
</div>
<div id="drop-zone">ここに複数の画像をドロップ</div>
<div id="status"></div>
<script>
const dropZone = document.getElementById('drop-zone');
const status = document.getElementById('status');
const slider = document.getElementById('quality-slider');
const display = document.getElementById('quality-display');
// スライダーの値が変更されたら表示を更新
slider.oninput = function() {
display.innerText = parseFloat(this.value).toFixed(2);
};
dropZone.ondragover = () => { dropZone.classList.add('hover'); return false; };
dropZone.ondragleave = () => { dropZone.classList.remove('hover'); return false; };
dropZone.ondrop = async (e) => {
e.preventDefault();
dropZone.classList.remove('hover');
const files = Array.from(e.dataTransfer.files).filter(f => f.type.match('image.*'));
if (files.length === 0) return;
const currentQuality = parseFloat(slider.value);
status.innerText = `${files.length}枚を Quality ${currentQuality} で調律中...`;
const zip = new JSZip();
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
for (let file of files) {
const img = await new Promise(resolve => {
const reader = new FileReader();
reader.onload = (re) => {
const i = new Image();
i.onload = () => resolve(i);
i.src = re.target.result;
};
reader.readAsDataURL(file);
});
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0);
// スライダーで指定されたクオリティで変換
const dataUrl = canvas.toDataURL('image/webp', currentQuality);
const base64Data = dataUrl.split(',')[1];
const fileName = file.name.replace(/\.[^/.]+$/, "") + ".webp";
zip.file(fileName, base64Data, {base64: true});
}
const content = await zip.generateAsync({type: "blob"});
const link = document.createElement('a');
link.href = URL.createObjectURL(content);
link.download = `webp_q${currentQuality}_${new Date().getTime()}.zip`;
link.click();
status.innerText = `完了! (Quality: ${currentQuality})`;
};
</script>
</body>
</html>
こんな感じになっています。