views.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. # background_remover/views.py
  2. import io
  3. from PIL import Image
  4. from django.http import HttpResponse
  5. from rest_framework.views import APIView
  6. from rest_framework.parsers import MultiPartParser
  7. from .services import BiRefNetService
  8. from django.shortcuts import render
  9. import zipfile
  10. import time
  11. class BackgroundRemovalView(APIView):
  12. parser_classes = [MultiPartParser]
  13. def get(self, request):
  14. return render(request, "bg_remover_index.html")
  15. def post(self, request, *args, **kwargs):
  16. if 'image' not in request.FILES:
  17. return HttpResponse("No image provided", status=400)
  18. # 1. Load image from request
  19. input_file = request.FILES['image']
  20. input_image = Image.open(input_file)
  21. # 2. Process via Service
  22. service = BiRefNetService()
  23. output_image = service.remove_background(input_image)
  24. # 3. Prepare response
  25. buffer = io.BytesIO()
  26. output_image.save(buffer, format="PNG")
  27. return HttpResponse(buffer.getvalue(), content_type="image/png")
  28. class BulkBackgroundRemovalAPI(APIView):
  29. parser_classes = [MultiPartParser]
  30. def post(self, request):
  31. files = request.FILES.getlist("images")
  32. if not files:
  33. return HttpResponse({"error": "No images provided"}, status=400)
  34. service = BiRefNetService()
  35. start_time = time.time()
  36. zip_buffer = io.BytesIO()
  37. # with zipfile.ZipFile(zip_buffer, "w", zipfile.ZIP_DEFLATED) as zip_file:
  38. # for file in files:
  39. # try:
  40. # image = Image.open(file).convert("RGB")
  41. # output = service.remove_background(image)
  42. # img_buffer = io.BytesIO()
  43. # output.save(img_buffer, format="PNG")
  44. # name = file.name.rsplit(".", 1)[0] + "_whitebg.png"
  45. # zip_file.writestr(name, img_buffer.getvalue())
  46. # except Exception as e:
  47. # print(f"Error processing {file.name}: {e}")
  48. with zipfile.ZipFile(zip_buffer, "w", zipfile.ZIP_DEFLATED) as master_zip:
  49. for file in files:
  50. # CHECK IF FILE IS A ZIP
  51. if file.name.lower().endswith('.zip'):
  52. with zipfile.ZipFile(file, 'r') as user_zip:
  53. for inner_file_name in user_zip.namelist():
  54. # Skip directories and non-image files
  55. if inner_file_name.endswith(('.png', '.jpg', '.jpeg', '.webp')):
  56. with user_zip.open(inner_file_name) as inner_file:
  57. img_data = inner_file.read()
  58. image = Image.open(io.BytesIO(img_data)).convert("RGB")
  59. output = service.remove_background(image)
  60. img_io = io.BytesIO()
  61. output.save(img_io, format="PNG")
  62. # Create clean name for the output zip
  63. clean_name = inner_file_name.rsplit(".", 1)[0].split('/')[-1] + "_no_bg.png"
  64. master_zip.writestr(clean_name, img_io.getvalue())
  65. # PROCESS INDIVIDUAL IMAGES (Existing logic)
  66. else:
  67. try:
  68. image = Image.open(file).convert("RGB")
  69. output = service.remove_background(image)
  70. img_io = io.BytesIO()
  71. output.save(img_io, format="PNG")
  72. name = file.name.rsplit(".", 1)[0] + "_no_bg.png"
  73. master_zip.writestr(name, img_io.getvalue())
  74. except Exception as e:
  75. print(f"Error processing {file.name}: {e}")
  76. zip_buffer.seek(0)
  77. total_time = round(time.time() - start_time, 2)
  78. response = HttpResponse(
  79. zip_buffer.getvalue(),
  80. content_type="application/zip"
  81. )
  82. response["Content-Disposition"] = "attachment; filename=processed_images.zip"
  83. response["X-Processing-Time"] = f"{total_time}s"
  84. return response