img2img.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import json
  2. import os
  3. import requests
  4. import io
  5. import base64
  6. from PIL import Image, PngImagePlugin
  7. from dotenv import load_dotenv
  8. from utils.logger import logger
  9. load_dotenv() # 加载环境变量
  10. img_url = os.getenv('img_url')
  11. def img_2_img(prompt, mask_img, img_key, img_path, output_directory):
  12. with open(img_path, 'rb') as f:
  13. image_data = f.read()
  14. input_image = base64.b64encode(image_data).decode('utf-8')
  15. mask = base64.b64encode(mask_img).decode('utf-8')
  16. payload = {
  17. "init_images": [
  18. input_image
  19. ],
  20. "denoising_strength": 0.96,
  21. "mask": mask,
  22. "prompt": prompt,
  23. "negative_prompt": "EasyNegativeV2,(badhandv4:1.2)",
  24. "batch_size": 1,
  25. "inpainting_mask_invert": 1,
  26. "steps": 30,
  27. "cfg_scale": 7,
  28. "sampler_index": "DPM++ 2M Karras",
  29. "alwayson_scripts": {
  30. "ADetailer": {
  31. "args": [
  32. True,
  33. {
  34. "ad_model": "face_yolov8n.pt",
  35. "ad_prompt": prompt,
  36. "ad_negative_prompt": "EasyNegativeV2,(badhandv4:1.2)",
  37. }
  38. ]
  39. },
  40. "controlnet": {
  41. "args": [
  42. {
  43. "input_image": input_image,
  44. "module": "openpose_full",
  45. "model": "control_v11p_sd15_openpose [cab727d4]",
  46. }
  47. ]
  48. }
  49. }
  50. }
  51. response = requests.post(url=f'{img_url}/sdapi/v1/img2img', json=payload)
  52. r = response.json()
  53. output_path = output_directory + f"/{img_key}-output.jpg"
  54. try:
  55. result = r['images'][0]
  56. image = Image.open(io.BytesIO(base64.b64decode(result.split(",", 1)[0])))
  57. image.save(output_path)
  58. return output_path
  59. except:
  60. logger.error('img2img error' + str(r))
  61. return None