Зачем нужен API для сжатия изображений?
Ручное сжатие не масштабируется. Если приложение обрабатывает пользовательские загрузки, генерирует миниатюры, работает с каталогами товаров или собирает статические сайты — нужна программная оптимизация. API позволяет сжимать, масштабировать и конвертировать изображения в рамках CI/CD, serverless-функций, CMS-вебхуков или фоновых задач.
Deflato API — простой REST-интерфейс. Входные форматы: JPEG, PNG, WebP, AVIF, HEIC, TIFF, PDF. Выходные: JPEG, WebP, AVIF.
Получение API-ключа
- Создайте аккаунт на deflato.com.
- Перейдите в Settings → API.
- Нажмите Generate API Key и скопируйте ключ.
- Храните ключ в переменных окружения (
DEFLATO_API_KEY), не в коде.
Бесплатный план — 100 API-сжатий в месяц. Pro и Team — больше.
Основы API: примеры cURL
Единый эндпоинт:
POST https://deflato.com/api/v1/compress
Принимает multipart/form-data.
Базовое сжатие
curl -X POST https://deflato.com/api/v1/compress -H "Authorization: Bearer $DEFLATO_API_KEY" -F "file=@photo.jpg" --output compressed.jpg
По умолчанию: тот же формат, quality 80, без масштабирования, EXIF удалён.
Конвертация формата
curl -X POST https://deflato.com/api/v1/compress -H "Authorization: Bearer $DEFLATO_API_KEY" -F "file=@photo.jpg" -F "output_format=WEBP" -F "quality=80" --output photo.webp
Масштабирование + сжатие
curl -X POST https://deflato.com/api/v1/compress -H "Authorization: Bearer $DEFLATO_API_KEY" -F "file=@photo.jpg" -F "output_format=AVIF" -F "quality=70" -F "max_dimension=1920" --output photo.avif
HEIC → JPEG
curl -X POST https://deflato.com/api/v1/compress -H "Authorization: Bearer $DEFLATO_API_KEY" -F "file=@IMG_1234.heic" -F "output_format=JPEG" -F "quality=85" --output photo.jpg
Справочник параметров
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
file |
File | обязательный | Файл изображения (JPEG, PNG, WebP, AVIF, HEIC, TIFF, PDF) |
output_format |
String | Как на входе | Выходной формат: JPEG, WEBP, AVIF |
quality |
Integer | 80 | Качество сжатия (1–100) |
max_dimension |
Integer | 0 (без масштабирования) | Макс. ширина или высота в px (пропорционально) |
strip_exif |
Boolean | true | Удалить EXIF/метаданные |
Python SDK
pip install deflato
Базовое использование
import deflato
client = deflato.Client(api_key="YOUR_API_KEY")
result = client.compress(
"photo.jpg",
output_format="WEBP",
quality=80,
max_dimension=1920
)
result.save("photo.webp")
print(f"Original: {result.original_size / 1024:.0f} KB")
print(f"Compressed: {result.compressed_size / 1024:.0f} KB")
print(f"Savings: {result.savings_percent:.1f}%")
Пакетная обработка
import deflato
from pathlib import Path
client = deflato.Client(api_key="YOUR_API_KEY")
input_dir = Path("./images")
output_dir = Path("./optimized")
output_dir.mkdir(exist_ok=True)
for image_path in input_dir.glob("*.jpg"):
result = client.compress(
str(image_path),
output_format="WEBP",
quality=80
)
result.save(output_dir / f"{image_path.stem}.webp")
print(f"{image_path.name}: {result.savings_percent:.1f}% saved")
Интеграция с Django
import deflato
from django.core.files.base import ContentFile
client = deflato.Client(api_key=settings.DEFLATO_API_KEY)
def optimize_upload(instance, **kwargs):
if instance.image:
result = client.compress(
instance.image.path,
output_format="WEBP",
quality=80,
max_dimension=1600
)
instance.image.save(
f"{instance.image.name.rsplit('.', 1)[0]}.webp",
ContentFile(result.content),
save=False
)
Node.js SDK
npm install deflato
Базовое использование
const Deflato = require('deflato');
const fs = require('fs');
const client = new Deflato({ apiKey: process.env.DEFLATO_API_KEY });
async function compressImage() {
const result = await client.compress('./photo.jpg', {
outputFormat: 'WEBP',
quality: 80,
maxDimension: 1920
});
fs.writeFileSync('./photo.webp', result.buffer);
console.log(`Original: ${(result.originalSize / 1024).toFixed(0)} KB`);
console.log(`Compressed: ${(result.compressedSize / 1024).toFixed(0)} KB`);
console.log(`Savings: ${result.savingsPercent.toFixed(1)}%`);
}
compressImage();
Пакетная обработка с контролем параллелизма
const Deflato = require('deflato');
const fs = require('fs');
const path = require('path');
const { promisify } = require('util');
const glob = promisify(require('glob'));
const client = new Deflato({ apiKey: process.env.DEFLATO_API_KEY });
async function batchCompress(inputDir, outputDir, concurrency = 5) {
const files = await glob(`${inputDir}/*.{jpg,png,jpeg}`);
fs.mkdirSync(outputDir, { recursive: true });
for (let i = 0; i < files.length; i += concurrency) {
const batch = files.slice(i, i + concurrency);
const results = await Promise.all(
batch.map(async (file) => {
const result = await client.compress(file, {
outputFormat: 'WEBP',
quality: 80
});
const outPath = path.join(
outputDir,
path.basename(file, path.extname(file)) + '.webp'
);
fs.writeFileSync(outPath, result.buffer);
return { file: path.basename(file), savings: result.savingsPercent };
})
);
results.forEach(r =>
console.log(`${r.file}: ${r.savings.toFixed(1)}% saved`)
);
}
}
batchCompress('./images', './optimized');
MCP-сервер
Deflato предоставляет MCP-сервер (Model Context Protocol), позволяющий AI-ассистентам сжимать изображения в рамках автоматизированных рабочих процессов.
{
"mcpServers": {
"deflato": {
"command": "npx",
"args": ["-y", "deflato-mcp-server"],
"env": {
"DEFLATO_API_KEY": "YOUR_API_KEY"
}
}
}
}
После настройки AI-ассистент может вызывать инструменты Deflato для сжатия, конвертации и масштабирования — без ручных API-вызовов.
Обработка ошибок
Стандартные HTTP-коды:
200— успех, тело ответа — сжатое изображение.400— неверный запрос (невалидный формат, quality вне диапазона).401— неавторизован (ключ отсутствует или отозван).413— файл слишком большой.429— превышен rate limit. Повторите с экспоненциальным backoff.500— ошибка сервера. Повторите запрос.
import deflato
client = deflato.Client(api_key="YOUR_API_KEY")
try:
result = client.compress("photo.jpg", output_format="WEBP", quality=80)
result.save("photo.webp")
except deflato.AuthenticationError:
print("Invalid API key")
except deflato.RateLimitError as e:
print(f"Rate limited. Retry after {e.retry_after} seconds")
except deflato.FileTooLargeError:
print("File exceeds the maximum upload size")
except deflato.APIError as e:
print(f"API error: {e.message}")
Лимиты и тарифы
| План | API-сжатий / мес. | Макс. файл | Rate limit |
|---|---|---|---|
| Free | 100 | 10 МБ | 10 req/min |
| Pro | 10 000 | 50 МБ | 60 req/min |
| Team | 100 000 | 100 МБ | 300 req/min |
| Enterprise | Custom | Custom | Custom |
Проверка текущего потребления:
curl https://deflato.com/api/v1/usage -H "Authorization: Bearer $DEFLATO_API_KEY"
{
"plan": "pro",
"compressions_used": 1847,
"compressions_limit": 10000,
"period_ends": "2026-04-01T00:00:00Z"
}
Лучшие практики
- Кэшируйте результаты — не сжимайте одно изображение дважды.
- Переменные окружения для API-ключа — никогда не коммитьте ключи.
- Retry с backoff для ответов 429 и 500.
- Таймаут — 30 с для больших файлов.
- Сжимайте при загрузке, а не по запросу — избегайте задержки на каждый запрос пользователя.
- Мониторьте потребление через
/usage.
Заключение
Deflato API превращает оптимизацию изображений из ручной задачи в автоматический шаг пайплайна. Загрузите изображение, укажите параметры — получите оптимизированный результат. Начните с cURL-примеров, затем подключите Python или Node.js SDK для продакшена.