Amazonで商品を見るセール会場へ

PNGをWebPに変換するときの決め方|可逆と非可逆でどれだけ変わるか測った

画像をWebPにすると軽くなると言われるが、どれだけ小さくなるかは設定と画像の中身で変わる。

変換の方式には、元の画素をそのまま保つものと、情報を捨てて小さくするものがある。

ここでは、実際に手元で変換して測った数値をもとに、どちらを選ぶかの考え方を整理する。

測定は2026年9月20日にPython 3.13とPillow 12.3.0で実行した。

目次

実際に測った数値

同じ画像をPNGとWebPで保存し、大きさと、元の画素との差を比べた。

1枚目は文字と単色の面が多い画像(1280×720)である。

保存の仕方大きさPNG比元と一致画素の平均差最大差
PNG82,785 バイト100%
WebP 可逆45,614 バイト55.1%一致する00
WebP 品質9014,908 バイト18.0%一致しない1.0819
WebP 品質8010,986 バイト13.3%一致しない1.1435
WebP 品質759,700 バイト11.7%一致しない1.1738
文字と単色の面が多い画像での実測(2026年9月20日)

2枚目は別の図版(1280×720)で、傾向は同じだった。

保存の仕方大きさPNG比画素の平均差最大差
PNG91,319 バイト100%
WebP 可逆51,652 バイト56.6%00
WebP 品質9015,454 バイト16.9%0.9916
WebP 品質8011,356 バイト12.4%1.0723
WebP 品質759,966 バイト10.9%1.1031
別の図版での実測(2026年9月20日)

平均差と最大差は、0から255までの値としての差である。

平均が1前後でも最大が30を超える箇所があり、差は画像全体に均等ではない。

2つの方式の違い

方式画素小ささ向いている画像
可逆元と完全に同じPNGの約55%図版、スクリーンショット、透過が要るもの
非可逆わずかに変わるPNGの1〜2割写真、細かい階調が多いもの
方式による違い

可逆でもPNGから半分近くまで落ちるため、画素を変えたくない場合でも置き換える価値がある。

一方で、非可逆にすると1割台まで落ちるので、差が大きい。

この差をどう受け取るかは、その画像が何に使われるかで変わる。

どちらを選ぶかの決め方

画像の中身より先に、その画像に求める性質を決めるほうが早い。

求める性質選ぶ方式理由
文字がにじんでは困る可逆非可逆は輪郭の周りに差が出る
色を正確に伝えたい可逆画素が変わらない
読み込みを軽くしたい非可逆1割台まで落ちる
元画像として保管する可逆またはPNGのままあとから作り直せる
透過が要るどちらも可WebPは透過に対応している
求める性質から方式を決める

スクリーンショットや図版で文字が入っているものは、非可逆にすると輪郭の周りに差が出やすい。

実測でも、文字と単色の面が多い画像のほうが最大差が大きかった。

オンラインの変換を使うときに見るところ

ブラウザーで変換できるサービスは多いが、確かめておきたい点がいくつかある。

  • 可逆と非可逆を選べるか(選べないものは非可逆のことが多い)
  • 品質の数値を指定できるか
  • 元のファイルがどこへ送られるか(手元で処理するものと、送信するものがある)
  • 変換後にサイズを確かめられるか
  • 透過が残るか

公開前の資料や、他人から預かった画像を扱う場合は、送信の有無を先に確かめる。

手元で処理する形のサービスであれば、ファイルは外に出ない。

手元で変換する

同じ設定で何枚も変換するなら、手元で処理するほうが早い。

PythonのPillowを使う場合はこう書ける。

from pathlib import Path
from PIL import Image

for src in Path("対象のフォルダー").glob("*.png"):
    im = Image.open(src)
    # 画素を変えない
    im.save(src.with_suffix(".webp"), "WEBP", lossless=True)
    # 小さくしたい場合
    # im.save(src.with_suffix(".webp"), "WEBP", quality=80)

変換したあと、元と一致しているかを確かめたい場合は次のようにする。

from PIL import Image, ImageChops, ImageStat

a = Image.open("元.png").convert("RGB")
b = Image.open("変換後.webp").convert("RGB")
d = ImageChops.difference(a, b)
print("一致:", d.getbbox() is None)
print("平均差:", [round(x, 2) for x in ImageStat.Stat(d).mean])

ここでRGBAに変換して比べると、不透明な画像どうしでは差が出ないことがある。

実際にこの書き方で測ったときは、非可逆で圧縮したものまで一致と出てしまった。

比べるときはRGBにそろえる。

置き換えるときに気をつけること

  • 元のPNGを消す前に、変換後の見た目を実際に開いて確かめる
  • 差し替えるならURLも変わるため、参照している場所をすべて直す
  • 印刷や再編集に使う元データは、PNGのまま残しておく
  • 同じ設定で全部を変換せず、文字の多い画像だけ可逆にするなど分ける

容量を削ることだけを目的にすると、あとから作り直せない画像を非可逆にしてしまう。

まとめ

  • 実測では、可逆でPNGの約55%、品質80で約13%まで落ちた
  • 可逆は画素が元と完全に一致し、非可逆は平均1前後、最大30以上の差が出た
  • 文字や図版は可逆、写真は非可逆という分け方が扱いやすい
  • オンラインの変換は、ファイルが送信されるかどうかを先に確かめる
  • 比べるときはRGBにそろえる。RGBAだと差が出ないことがある

測定は2026年9月20日にPython 3.13とPillow 12.3.0で実行したものである。

画像の中身によって数値は変わるため、自分が扱う画像で測り直してほしい。

WebPの仕様はGoogleの技術資料にまとまっている。

作業を楽にする道具はPCメソッドのまとめにも置いている。

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

仕事効率化のおすすめ書籍

仕事用PCの選び方

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次