smol-image-processor – EXIF/meta verilerini kaldırıp WebP'ye normalize eden mikroservis (Bun/Elysia)
(github.com/levish0)Backend tarafında kullanıcı görsel yüklemeleri alınırken sessizce beraberinde gelen bazı sorunlar vardır.
- JPEG içinde GPS koordinatları, cihaz model adı ve çekim zamanı EXIF olarak yer alabilir
- ICC profili gibi renk meta verileri de olduğu gibi saklanıp dağıtılabilir
- JPEG, PNG, GIF ve WebP karışık şekilde gelirse depolama/CDN/rendering pipeline'ı karmaşıklaşır
- Yalnızca EXIF orientation yanlış işlense bile görsel 90° dönmüş halde kaydedilebilir
smol-image-processor, bu sorunları topluca ele alan tek amaçlı bir mikroservistir.
Nasıl çalışır
Görseli POST /process uç noktasına multipart/form-data olarak yüklediğinizde, yanıt her zaman WebP olarak
döner. Sharp'ın varsayılan çıktı davranışının kaynak EXIF, ICC profili ve benzeri meta verileri
atma özelliğinden doğrudan yararlanır. Ancak EXIF orientation, meta veriler kaldırılmadan
önce .rotate() ile önce piksellere uygulanır; böylece görsel yönü korunur.
İki savunma katmanı vardır.
- Piksel sayısı sınırı (MAX_PIXELS): Dosya boyutu küçük olsa bile decode edildiğinde yüz milyonlarca piksele
şişen görselleri (decompression bomb), Sharp'ınlimitInputPixelsözelliğiyle engeller. - Kare sayısı sınırı (MAX_PAGES): Yüzlerce ya da binlerce kare içeren animasyonlu GIF/WebP dosyalarıyla
bellek ve CPU'yu tüketen DoS saldırılarını önler.
Animasyonlu GIF/WebP dosyaları animated WebP'ye dönüştürülür ve kare gecikmeleri ile döngü sayısı
korunur. PNG'nin alfa kanalı da olduğu gibi korunur.
Yanıt başlıklarında işlenen görselin width, height, size, animated olup olmadığı ve sayfa sayısı
yer alır; böylece ayrı bir meta veri çıkarma adımı olmadan doğrudan DB'ye kaydedilebilir.
Yığın
- Runtime: Bun, HTTP framework: Elysia
- Görsel işleme: Sharp (libvips sarmalayıcısı)
- Docker imajı sağlanır (GHCR)
Hızlı başlangıç
docker run --rm -p 6701:6701 ghcr.io/levish0/smol-image-processor
curl -F file=@photo.jpg http://localhost:6701/process -o clean.webp
Henüz yorum yok.