rembg-as / app.py
JerryCoder's picture
© 2025 by JerryCoder
671ba32 verified
import requests
import json
import uuid
from fastapi import FastAPI, UploadFile, File, Query
from fastapi.responses import JSONResponse, Response
from fastapi.middleware.cors import CORSMiddleware
from rembg import remove
import uvicorn
# --------------------------
# Temp Memory Storage
# --------------------------
TEMP_FILES = {}
# --------------------------
# Pretty JSON Response
# --------------------------
class PrettyJSONResponse(JSONResponse):
def render(self, content) -> bytes:
return json.dumps(content, indent=4, ensure_ascii=False).encode("utf-8")
app = FastAPI(
title="AI ClearCut - HF UltraFast BG Remover",
default_response_class=PrettyJSONResponse
)
# --------------------------
# CORS
# --------------------------
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# --------------------------
# Root
# --------------------------
@app.get("/")
async def root():
return {
"message": "HF UltraFast Background Remover Running 🚀",
"endpoints": {
"POST /upload": "Upload image",
"GET /json?url=": "Image from URL",
"GET /file/{id}": "Get processed image"
},
"creator": "Jerrycoder"
}
# --------------------------
# Serve temp file
# --------------------------
@app.get("/file/{file_id:path}")
async def get_file(file_id: str):
file_data = TEMP_FILES.get(file_id)
if not file_data:
return {"status": "error", "message": "File expired"}
return Response(content=file_data, media_type="image/png")
# --------------------------
# Process image
# --------------------------
def process_image(img_bytes: bytes):
try:
# Remove background
output_bytes = remove(img_bytes)
# Generate unique ID
file_ext = "png" # default
file_id = f"{uuid.uuid4()}.{file_ext}"
file_url = f"https://jerrycoder-rembg-as.hf.space/file/{file_id}"
# Store temporarily
TEMP_FILES[file_id] = output_bytes
return {
"status": "success",
"url": file_url,
"full_url": file_url,
"creator": "Jerrycoder"
}
except Exception as e:
return {"status": "error", "message": str(e)}
# --------------------------
# POST upload
# --------------------------
@app.post("/upload")
async def upload_file(file: UploadFile = File(...)):
img_bytes = await file.read()
return process_image(img_bytes)
# --------------------------
# GET from URL
# --------------------------
@app.get("/json")
async def from_url(url: str = Query(...)):
try:
resp = requests.get(url, timeout=10)
resp.raise_for_status()
return process_image(resp.content)
except Exception as e:
return {"status": "error", "message": str(e)}
# --------------------------
# Run
# --------------------------
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=7860)