1 điểm bởi levish 4 giờ trước | Chưa có bình luận nào. | Chia sẻ qua WhatsApp

Khi backend nhận ảnh do người dùng tải lên, có những vấn đề âm thầm đi kèm.

  • JPEG có thể chứa tọa độ GPS, tên model thiết bị, thời điểm chụp trong EXIF
  • Metadata màu như ICC profile cũng có thể bị lưu trữ và phân phối nguyên trạng
  • Nếu JPEG, PNG, GIF, WebP lẫn lộn đi vào, pipeline lưu trữ/CDN/rendering sẽ trở nên phức tạp
  • Chỉ cần xử lý sai EXIF orientation là ảnh có thể bị lưu xoay 90°

smol-image-processor là một microservice đơn nhiệm xử lý toàn bộ các vấn đề này.

Cách hoạt động

Nếu tải ảnh lên POST /process bằng multipart/form-data, phản hồi sẽ luôn là WebP.
Nó tận dụng trực tiếp đặc tính trong hành vi xuất mặc định của Sharp là loại bỏ metadata như EXIF nguồn, ICC profile, v.v. Tuy nhiên, EXIF orientation sẽ được áp dụng lên pixel trước bằng .rotate() trước khi xóa metadata, để hướng ảnh vẫn được giữ nguyên.

Có hai lớp phòng vệ.

  • Giới hạn số pixel (MAX_PIXELS): Ngay cả khi dung lượng file nhỏ, ảnh có thể phình ra thành hàng trăm triệu pixel khi giải mã; ảnh kiểu này (decompression bomb) sẽ bị chặn bằng limitInputPixels của Sharp.
  • Giới hạn số frame (MAX_PAGES): Ngăn DoS làm cạn kiệt bộ nhớ/CPU bằng GIF/WebP động có hàng trăm đến hàng nghìn frame.

GIF/WebP động sẽ được chuyển sang animated WebP, đồng thời giữ nguyên độ trễ giữa các frame và số lần lặp. Kênh alpha của PNG cũng được giữ nguyên.

Trong header phản hồi có chứa width, height, size, trạng thái animated và số trang của ảnh đã xử lý, nên có thể lưu thẳng vào DB mà không cần bước trích xuất metadata riêng.

Stack

  • Runtime: Bun, framework HTTP: Elysia
  • Xử lý ảnh: Sharp (wrapper của libvips)
  • Cung cấp Docker image (GHCR)

Bắt đầu nhanh

docker run --rm -p 6701:6701 ghcr.io/levish0/smol-image-processor
curl -F file=@photo.jpg http://localhost:6701/process -o clean.webp

https://github.com/levish0/smol-image-processor

Chưa có bình luận nào.

Chưa có bình luận nào.