Oh MyUtils

画像フォーマット変換 - PNG, JPG, WebP, AVIF変換 オンライン

PNG、JPG、WebP、AVIF形式の画像をブラウザ上で変換。一括変換、品質調整、ファイルサイズ比較 — サーバーへのアップロード不要。

よくある質問

画像フォーマットコンバーターとは何ですか?なぜ必要ですか?

画像フォーマットコンバーターは、画像をあるファイル形式から別の形式に変換します(例:PNGからWebP、JPGからAVIF)。WebPやAVIFなどの最新フォーマットは従来のPNGやJPEGよりも大幅に小さいファイルサイズを提供するため、ウェブ開発に不可欠です。ページの読み込み時間の短縮、帯域幅コストの削減、Core Web Vitalsスコアの向上につながります。一般的な2MBのPNG画像は、視覚的な品質の低下を最小限に抑えながら500KB未満のWebPに変換できます。

この画像フォーマットコンバーターの使い方は?

1. アップロードエリアに画像をドラッグ&ドロップします(またはクリックしてファイルを参照)。2. 出力フォーマットを選択します(PNG、JPG、WebP、またはAVIF)。3. 非可逆フォーマットの品質スライダーを調整します(デフォルトは80%)。4. 個別の画像には「変換」を、バッチ処理には「すべて変換」をクリックします。5. 変換前後のファイルサイズ比較を確認します。6. 個別の画像をダウンロードするか、「すべてダウンロード」でZIPアーカイブを取得します。

画像データは安全ですか?画像はサーバーにアップロードされますか?

画像は100%安全で、ブラウザの外に出ることはありません。すべてのフォーマット変換はHTML5 Canvas APIを使用してクライアントサイドで実行されます。画像データはどのサーバーにも送信されないため、このツールは完全にプライベートです。ページが読み込まれた後はオフラインでも使用できます。

PNG、JPG、WebP、AVIFの違いは何ですか?

PNGは透過性をサポートする可逆圧縮フォーマットで、グラフィックやアイコンに最適ですがファイルサイズが大きくなります。JPG/JPEGは透過性のない非可逆フォーマットで、写真に適した良好な圧縮率を提供します。WebPは透過性付きの可逆・非可逆両方の圧縮をサポートする最新フォーマットで、通常JPEGより25〜35%小さく、95%以上のブラウザでサポートされています。AVIFは最も新しいフォーマットで、最高の圧縮率(WebPより20〜50%小さい)と透過性をサポートしていますが、ブラウザのサポートはまだ拡大中です。

変換後のファイルがオリジナルより大きいのはなぜですか?

これは高圧縮フォーマットから効率の低いフォーマットに変換する場合(例:WebPからPNG)や、オリジナルが既に十分に最適化されている場合に発生することがあります。Canvas APIのPNG出力は常に可逆であるため、非可逆の代替手段より大きくなる場合があります。最適なサイズ対品質比のために、80%の品質設定でWebPまたはAVIFを使用してみてください。

このツールはすべてのブラウザでAVIFをサポートしていますか?

Canvas APIを介したAVIFエンコーディングは現在Chrome 96+とEdge 96+でサポートされています。FirefoxとSafariのAVIFエンコーディングサポートは限定的です。このツールはブラウザの機能を自動的に検出し、AVIFがサポートされていない場合はそのオプションを無効にして明確なメッセージを表示します。

JPGに変換すると透過性はどうなりますか?

JPEGは透過性をサポートしていません。透過のあるPNGまたはWebP画像をJPGに変換すると、透過部分は背景色(デフォルトは白)で塗りつぶされます。出力フォーマットとしてJPGを選択すると表示されるカラーピッカーを使用して、カスタム背景色を選択できます。

複数の画像を一度に変換できますか?

はい、バッチ変換は最大20枚の画像を同時にサポートします。すべての画像が同じターゲットフォーマットと同じ品質設定で変換されます。変換後、「すべてダウンロード(ZIP)」を使用して、変換されたすべての画像を1つのZIPファイルでダウンロードできます。

コード例

// Client-side image format conversion using Canvas API
async function convertImageFormat(file, outputFormat, quality = 0.8) {
  return new Promise((resolve, reject) => {
    const img = new Image();
    const url = URL.createObjectURL(file);

    img.onload = () => {
      URL.revokeObjectURL(url);

      const canvas = document.createElement('canvas');
      canvas.width = img.width;
      canvas.height = img.height;

      const ctx = canvas.getContext('2d');

      // Fill background for JPEG (no transparency support)
      if (outputFormat === 'image/jpeg') {
        ctx.fillStyle = '#ffffff';
        ctx.fillRect(0, 0, canvas.width, canvas.height);
      }

      ctx.drawImage(img, 0, 0);

      canvas.toBlob(
        (blob) => {
          if (!blob) {
            reject(new Error('Conversion failed'));
            return;
          }
          resolve({
            blob,
            originalSize: file.size,
            convertedSize: blob.size,
            inputFormat: file.type,
            outputFormat: outputFormat,
            sizeDiff: Math.round(((blob.size - file.size) / file.size) * 100),
          });
        },
        outputFormat,
        outputFormat === 'image/png' ? undefined : quality
      );
    };

    img.onerror = () => {
      URL.revokeObjectURL(url);
      reject(new Error('Failed to load image'));
    };

    img.src = url;
  });
}

// Check AVIF support
async function checkAvifSupport() {
  const canvas = document.createElement('canvas');
  canvas.width = 1;
  canvas.height = 1;
  return new Promise((resolve) => {
    canvas.toBlob(
      (blob) => resolve(blob?.type === 'image/avif'),
      'image/avif',
      0.5
    );
  });
}

// Batch conversion
async function convertBatch(files, outputFormat, quality = 0.8) {
  const results = [];
  for (const file of files) {
    try {
      const result = await convertImageFormat(file, outputFormat, quality);
      results.push({ filename: file.name, ...result });
    } catch (error) {
      results.push({ filename: file.name, error: error.message });
    }
  }
  return results;
}

// Usage
const input = document.querySelector('input[type="file"]');
input.addEventListener('change', async (e) => {
  const files = Array.from(e.target.files);
  const results = await convertBatch(files, 'image/webp', 0.8);

  results.forEach((result) => {
    if (result.error) {
      console.error(`${result.filename}: ${result.error}`);
    } else {
      console.log(
        `${result.filename}: ${result.inputFormat} -> ${result.outputFormat}, ` +
        `${result.originalSize} -> ${result.convertedSize} (${result.sizeDiff}%)`
      );
    }
  });
});

関連ツール