# import base64 # import requests # import os # from PIL import Image # import io # def inpaint(img_path:str,mask_path:str)->"img content (resp.content)": # image_bytes = open(img_path, 'rb') # mask_bytes = open(mask_path, 'rb') # # 将字节数据转换为Base64编码的字符串 # files = { # "image": image_bytes, # "mask":mask_bytes # } # payload = { # "ldmSteps": 25, # "ldmSampler": "plms", # "zitsWireframe": True, # "hdStrategy": "Crop", # "hdStrategyCropMargin": 196, # "hdStrategyCropTrigerSize": 800, # "hdStrategyResizeLimit": 2048, # "prompt": "", # "negativePrompt": "", # "croperX": 307, # "croperY": 544, # "croperHeight": 512, # "croperWidth": 512, # "useCroper": False, # "sdMaskBlur": 5, # "sdStrength": 0.75, # "sdSteps": 50, # "sdGuidanceScale": 7.5, # "sdSampler": "uni_pc", # "sdSeed": -1, # "sdMatchHistograms": False, # "sdScale": 1, # "cv2Radius": 5, # "cv2Flag": "INPAINT_NS", # "paintByExampleSteps": 50, # "paintByExampleGuidanceScale": 7.5, # "paintByExampleSeed": -1, # "paintByExampleMaskBlur": 5, # "paintByExampleMatchHistograms": False, # "p2pSteps": 50, # "p2pImageGuidanceScale": 1.5, # "p2pGuidanceScale": 7.5, # "controlnet_conditioning_scale": 0.4, # "controlnet_method": "control_v11p_sd15_canny" # }#payload用data # #不使用header # #resp = requests.post("https://sanster-lama-cleaner-lama.hf.space/inpaint", data=payload, files=files) # #使用自己的space # resp = requests.post("https://rogerxavier-lama-cleaner-lama.hf.space/inpaint", data=payload, files=files) # print("请求lama clenaer状态是",resp.status_code) # return bytes(resp.content) # def save_img(img_content:"要处理的图片数据",new_save_path:"新文件的保存路径(包含后缀)",old_img_path:"旧文件路径")->"void生成新的文件保存 ,传入旧文件路径是为了删除有问题的旧文件": # print(new_save_path) # try: # img = Image.open(io.BytesIO(img_content)) # # 如果需要指定图像格式,可以在保存时指定 # img.save(new_save_path, format="JPEG") # except Exception as e: # #对于可能异常的图片->比如因为不合规导致resp.content没有正常返回 # print(e,new_save_path,"图片返回有问题,跳过并删除图片.这里的路径是新保存路径") # os.remove(old_img_path) # if __name__ == '__main__': # # 获取当前目录的子目录的路径 # img_path = 'manga' # subdir_path = os.path.join(os.getcwd(), img_path) # # 图片素材获取(包含子目录下所有图片) # image_files = [] # for root, dirs, files in os.walk(subdir_path): # for file in files: # if file.endswith(".jpg") or file.endswith(".png"): # image_files.append(os.path.relpath(os.path.join(root, file))) # # 创建处理后的子目录在与image_files同级目录下 # processed_subdir_path = os.path.join(os.path.dirname(subdir_path), f"{img_path}1") # os.makedirs(processed_subdir_path, exist_ok=True) # # 对image_files进行某种处理,生成新图片,并保存在处理后的子目录中 # for img_file in image_files: # # 处理图片的代码(这里仅作示例) # # 假设处理后的图片为new_img # img_dir = os.path.dirname(img_file) # new_img_dir = os.path.join(processed_subdir_path, img_dir) # os.makedirs(new_img_dir, exist_ok=True) # new_img_path = os.path.join(new_img_dir, os.path.basename(img_file)) # if not os.path.exists(new_img_path): # #如果已经处理过那么跳过 # # 处理图片并保存 # img_inpainted = inpaint(img_path=img_file, mask_path='mask/0.jpg')#上传的遮罩保存都是0开始 # save_img(img_content=img_inpainted, new_save_path=new_img_path,old_img_path=img_file) # else: # print(f"Skipping {new_img_path} as it already exists.") import base64 import requests import os from typing import List import io from PIL import Image from pydantic import BaseModel from lama_cleaner.server import process from lama_cleaner.server import main#先初始化才能用process #C:\Users\17331\.cache\torch\hub 缓存下载位置,记得删 class FakeArgs(BaseModel): host: str = "0.0.0.0" port: int = 7860 model: str = 'lama' hf_access_token: str = "" sd_enable_xformers: bool = False sd_disable_nsfw: bool = False sd_cpu_textencoder: bool = True sd_controlnet: bool = False sd_controlnet_method: str = "control_v11p_sd15_canny" sd_local_model_path: str = "" sd_run_local: bool = False local_files_only: bool = False cpu_offload: bool = False device: str = "cpu" gui: bool = False gui_size: List[int] = [1000, 1000] input: str = '' disable_model_switch: bool = True debug: bool = False no_half: bool = False disable_nsfw: bool = False enable_xformers: bool = False enable_interactive_seg: bool = True interactive_seg_model: str = "vit_b" interactive_seg_device: str = "cpu" enable_remove_bg: bool = False enable_anime_seg: bool = False enable_realesrgan: bool = False enable_gfpgan: bool = False gfpgan_device: str = "cpu" enable_restoreformer: bool = False enable_gif: bool = False quality: int = 95 model_dir: str = None output_dir: str = None def inpaint(img_path: str, mask_path: str) -> "img content (resp.content)": # urllib3 1.26.4 兼容 image_bytes = open('image.jpg', 'rb') mask_bytes = open('mask.jpg', 'rb') # 将字节数据转换为Base64编码的字符串 files = { "image": image_bytes, "mask": mask_bytes } payload = { "ldmSteps": 25, "ldmSampler": "plms", "zitsWireframe": True, "hdStrategy": "Crop", "hdStrategyCropMargin": 196, "hdStrategyCropTrigerSize": 800, "hdStrategyResizeLimit": 2048, "prompt": "", "negativePrompt": "", "croperX": 307, "croperY": 544, "croperHeight": 512, "croperWidth": 512, "useCroper": False, "sdMaskBlur": 5, "sdStrength": 0.75, "sdSteps": 50, "sdGuidanceScale": 7.5, "sdSampler": "uni_pc", "sdSeed": -1, "sdMatchHistograms": False, "sdScale": 1, "cv2Radius": 5, "cv2Flag": "INPAINT_NS", "paintByExampleSteps": 50, "paintByExampleGuidanceScale": 7.5, "paintByExampleSeed": -1, "paintByExampleMaskBlur": 5, "paintByExampleMatchHistograms": False, "p2pSteps": 50, "p2pImageGuidanceScale": 1.5, "p2pGuidanceScale": 7.5, "controlnet_conditioning_scale": 0.4, "controlnet_method": "control_v11p_sd15_canny" } # payload用data resp = process(files=files, payload=payload) return resp def save_img(img_content: "要处理的图片数据", new_save_path: "新文件的保存路径(包含后缀)", old_img_path: "旧文件路径") -> "void生成新的文件保存 ,传入旧文件路径是为了删除有问题的旧文件": print(new_save_path) try: # 从 _io.BytesIO 对象中读取字节数据 resp_bytes = img_content.read() # 使用 Image.open() 方法打开图片 img = Image.open(io.BytesIO(resp_bytes)) # 如果需要指定图像格式,可以在保存时指定 img.save(new_save_path, format="JPEG") except Exception as e: # 对于可能异常的图片->比如因为不合规导致resp.content没有正常返回 print(e, new_save_path, "图片返回有问题,跳过并删除图片.这里的路径是新保存路径") os.remove(old_img_path) if __name__ == '__main__': main(FakeArgs())#初始化model # 获取当前目录的子目录的路径 img_path = 'manga' subdir_path = os.path.join(os.getcwd(), img_path) # 图片素材获取(包含子目录下所有图片) image_files = [] for root, dirs, files in os.walk(subdir_path): for file in files: if file.endswith(".jpg") or file.endswith(".png"): image_files.append(os.path.relpath(os.path.join(root, file))) # 创建处理后的子目录在与image_files同级目录下 processed_subdir_path = os.path.join(os.path.dirname(subdir_path), f"{img_path}1") os.makedirs(processed_subdir_path, exist_ok=True) # 对image_files进行某种处理,生成新图片,并保存在处理后的子目录中 for img_file in image_files: # 处理图片的代码(这里仅作示例) # 假设处理后的图片为new_img img_dir = os.path.dirname(img_file) new_img_dir = os.path.join(processed_subdir_path, img_dir) os.makedirs(new_img_dir, exist_ok=True) new_img_path = os.path.join(new_img_dir, os.path.basename(img_file)) if not os.path.exists(new_img_path): # 如果已经处理过那么跳过 # 处理图片并保存 img_inpainted = inpaint(img_path=img_file, mask_path='mask/0.jpg') # 上传的遮罩保存都是0开始 save_img(img_content=img_inpainted, new_save_path=new_img_path, old_img_path=img_file) else: print(f"Skipping {new_img_path} as it already exists.")