Base64 — кодирование, а не сжатие
Стандартный Base64 представляет три байта четырьмя символами: точная длина 4 × ceil(n / 3), устойчивое увеличение около 33,3%. Data URL добавляет MIME-префикс.
Инструмент сначала уменьшает байты изображения: декодирует, при необходимости меняет размеры, качество или формат и снова создаёт стандартный Base64.
Gzip создаёт другой результат
Gzip поверх Base64 даёт бинарные данные, которые нужно распаковать перед показом. Повторный Base64 не превращает их в обычную Data URL изображения.
JPEG, PNG и WebP уже сжаты. Уменьшение пикселей, качества, метаданных или смена формата может помочь, но не гарантирует отсутствие потерь или меньший размер.
Целевой размер без увеличения
Для JPEG и WebP качество ищется за фиксированное число шагов. Затем размеры уменьшаются ограниченными раундами с сохранением пропорций.
Если стандартный Base64 не стал короче, остаются исходные байты. Недостижение цели в КБ отмечается явно, а возвращается лучший меньший вариант.
Локальная обработка и границы
Всё остаётся во вкладке: без загрузки, внешних URL, телеметрии и библиотек. Ограничения — 20 МиБ и 16 мегапикселей.
SVG, GIF, ICO и анимированный WebP отклоняются, чтобы не выполнять содержимое и не терять кадры. Auto сохраняет прозрачность; JPEG требует подтверждённого фона. Canvas не является антивирусом.
Когда Base64 не подходит
Он удобен для небольших встроенных ресурсов. Большие изображения лучше хранить как Blob URL, отдельные файлы или передавать бинарно ради кэша и передачи.
Байты и символы Base64 сравниваются отдельно. Удаление префикса data: не считается сжатием.
Частые ошибки и причины
- Недопустимые символы, padding или длина Base64.
- Объявленный MIME расходится с magic bytes.
- Более 20 МиБ, 16 мегапикселей или ошибка декодирования.
- Анимация, несколько кадров, SVG или уже оптимизированное изображение.
Эквивалентные команды
Используйте доступную среду или оболочку. Проверяйте недоверенные данные и не выводите бинарные данные прямо в терминал.
Python
from PIL import Image
from io import BytesIO
import base64
image = Image.open(BytesIO(base64.b64decode(value)))
out = BytesIO(); image.save(out, 'WEBP', quality=82)
result = base64.b64encode(out.getvalue()).decode('ascii')
JavaScript
const blob = new Blob([bytes], { type: mime });
const bitmap = await createImageBitmap(blob);
ctx.drawImage(bitmap, 0, 0, width, height);
const output = await new Promise(r => canvas.toBlob(r, 'image/webp', 0.82));
bitmap.close();
Shell
printf '%s' "$VALUE" | base64 --decode > input.png
magick input.png -resize '1920x1920>' -quality 82 output.webp
base64 --wrap=0 output.webp
Стандарты и официальные источники
Вопросы о сжатии Base64-изображений
Можно ли сжать сам Base64?
Общее сжатие создаёт другой бинарный формат. Для стандартного Base64 изображения оптимизируют байты и кодируют заново.
Можно вставить результат в img src?
Да. Raw — стандартный Base64, Data URL — обычное data:image/...;base64 значение.
Как получить 100 КБ?
Выберите Custom и 100 КБ. Поиск качества и размеров ограничен; не каждое изображение достигает цели.
Снижается ли качество?
Возможно. Изменение размера и качества JPEG/WebP — с потерями; PNG может не уменьшиться.
Почему Base64 больше на 33%?
Три байта становятся четырьмя символами. Точная формула: 4 × ceil(n / 3).
Изображение загружается?
Нет. Анализ, Canvas, предпросмотр, копирование и скачивание выполняются локально.
Gzip до или после Base64?
Для передачи при необходимости сжимайте внешний HTTP-ответ. Gzip нельзя использовать как Data URL без распаковки.