百度AI图片助手 处理本地图片

import random
import time
import requests
import base64
import os
import datetime
import numpy as np
import cv2
from PIL import Image
import argparse


class IMGNetProcess(object):
    """
    百度 图片处理
    """

    def __init__(self, file, kind):
        self.file = file
        self.kind = kind
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36"
        }
        self.feature_map = {
            "1": self.move_water_mark,
            "3": self.clear_img,
            "4": self.extend_img,
            "6": self.re_drawl,
            "7": self.img_similar,
            "9": self.img_matting,
            "14": self.new_style,
            "15": self.draw_line,
        }

    def get_now_time(self):
        """

        :return:
        """
        return datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')

    def get_out_file(self, now_time, desc, task_id, index=""):
        """

        :return:
        """
        img_save_path = r"imgs"
        os.makedirs(img_save_path, exist_ok=True)
        img_name = f"{now_time}_{desc}_{self.kind}_{task_id}_{index}.png"
        img_file = os.path.join(img_save_path, img_name)
        return img_file

    def add_lines(self, points, desc, task_id):
        """

        :param points:
        :param desc:
        :param task_id:
        :return:
        """
        # img = cv2.imread(self.file)
        img = np.asarray(Image.open(self.file))

        lis = []
        for point in points:
            lis.append([point["x"], point["y"]])
        np_points = np.array(lis, np.int32)
        cv2.polylines(img, [np_points], isClosed=False, color=(255, 0, 0), thickness=2)

        mask = np.zeros(img.shape[:2], dtype=np.uint8)  # 创建黑色掩膜
        cv2.fillPoly(mask, [np_points], (255, 255, 255, 255))  # 填充多边形区域
        masked_image = cv2.bitwise_and(img, img, mask=mask)
        x, y, w, h = cv2.boundingRect(np_points)
        cropped_image = masked_image[y:y + h, x:x + w]
        now_time = self.get_now_time()
        img_file = self.get_out_file(now_time, desc, task_id)
        cv2.imencode(
            img_file, cv2.cvtColor(
                cropped_image, cv2.COLOR_RGB2BGR))[1].tofile(img_file)
        print(f"{img_file} 结果保存成功")

    def img_similar(self):
        """

        :return:
        """
        create_level = input("请输入相似等级 1-6:")
        try:
            if not (int(create_level) <= 6 and int(create_level) >= 1):
                raise ValueError
        except:
            create_level = "5"
        return {"create_level": int(create_level)}, "相似图"

    def img_matting(self):
        """

        :return:
        """
        return {}, "抠图"

    def new_style(self):
        """

        :return:
        """
        style = input("请输入风格类型:\n1-->宫崎骏风\n2-->橡皮泥风\n3-->油画风\n 默认为1:")
        style_map = {
            "1": "miyazaki",
            "2": "clay",
            "3": "monet",
        }
        return {"style": style_map.get(style, "1")}, "风格"

    def re_drawl(self):
        """

        :return:
        """
        create_level = input("请输入重绘等级 1-6:")
        try:
            if not (int(create_level) <= 6 and int(create_level) >= 1):
                raise ValueError
        except:
            create_level = "5"
        return {"create_level": int(create_level)}, "重绘"

    def extend_img(self):
        """

        :return:
        """
        ext_ratio = input("请输入扩图比例:\n1-->1:1\n2-->4:3\n3-->3:4\n 默认为1:")
        ext_map = {
            "1": "1:1",
            "2": "4:3",
            "3": "3:4",
        }
        return {"ext_ratio": ext_map.get(ext_ratio, "1")}, "扩图"

    def move_water_mark(self):
        """

        :return:
        """
        return {}, "去水印"

    def draw_line(self):
        """

        :return:
        """
        return {}, "线稿"

    def clear_img(self):
        """

        :return:
        """
        return {}, "清晰"

    def base_img(self):
        """

        :return:
        """
        with open(self.file, "rb") as fp:
            result = base64.b64encode(fp.read()).decode('utf-8')
            return result

    def add_task(self, img_base_data):
        """

        :param img_base_data:
        :return:
        """
        url = "https://image.baidu.com/aigc/pccreate"
        data = {
            "picInfo": f"data:image/png;base64,{img_base_data}",
            "type": f"{self.kind}"
        }
        res, desc = self.feature_map.get(f"{self.kind}")()
        data.update(res)
        response = requests.post(url, headers=self.headers, data=data)
        # print(response.json())
        pcEditTaskid = response.json()["pcEditTaskid"]
        print(f"任务提交成功:{pcEditTaskid}")
        return pcEditTaskid, desc

    def get_result(self, task_id, desc):
        """

        :param task_id:
        :param desc:
        :return:
        """
        file_list = []
        url = "https://image.baidu.com/aigc/pcquery"
        params = {
            "taskId": f"{task_id}",
        }
        while True:
            response = requests.get(url, headers=self.headers, params=params)
            res = response.json()
            isGenerate = res["isGenerate"]
            print(f"正在处理中: {res.get('progress')} %")
            now_time = self.get_now_time()
            if isGenerate:
                if self.kind == "9":
                    # print(res)
                    self.add_lines(res["foreground"][0]["outlines"][0]["line"], desc, task_id)
                    return file_list
                elif res.get('status') == 5:
                    print(res)
                    return file_list
                for index, i in enumerate(res["picArr"], 1):
                    img_file = self.get_out_file(now_time, desc, task_id, index)
                    with open(img_file, "wb") as fp:
                        fp.write(base64.b64decode(i["src"][23:]))
                    file_list.append(img_file)
                    print(f"{img_file} 结果保存成功")
                return file_list

            time.sleep(random.randint(1, 3))

    def process(self):
        """

        :return:
        """
        img_data = self.base_img()
        task_id, desc = self.add_task(img_data)
        self.get_result(task_id, desc)


if __name__ == '__main__':
    # file = R"C:\Users\JHC\Desktop\1.png"
    # file = input("请输入要处理的图片路径:")
    tip_msg = "mode可选:\n1-->去水印\t3-->清晰\t\t4-->扩图\n6-->重绘  \t7-->相似\t\t9-->抠图\n14-->风格\t15-->线稿\n"
    print("\t\t\t\tAI图片处理工具\n")
    # kind = input(tip_msg)

    parser = argparse.ArgumentParser(description=tip_msg)

    # 添加参数
    parser.add_argument('-i', dest='input_path', help='path to the img file')
    parser.add_argument('-m', dest='mode', help='mode for process')

    # 解析命令行参数
    args = parser.parse_args()

    # 调用函数并传递参数
    if args.input_path and args.mode:
        imgnp = IMGNetProcess(os.path.abspath(args.input_path), args.mode)
        imgnp.process()
    else:
        print("Please provide both -i and -m arguments")

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/894145.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络】HTTP报文详解,HTTPS基于HTTP做了哪些改进?(面试经典题)

HTTP协议基本报文格式 在计算机网络中&#xff0c;HTTP&#xff08;超文本传输协议&#xff09;是应用层的一种协议&#xff0c;用于客户端&#xff08;通常是浏览器&#xff09;和服务器之间的通信。HTTP报文分为请求报文和响应报文&#xff0c;以下是它们的基本格式。 1. H…

Java爬虫API:获取商品详情数据的利器

为什么选择Java爬虫API 强大的库支持&#xff1a;Java拥有丰富的网络编程库&#xff0c;如Apache HttpClient、OkHttp等&#xff0c;这些库提供了强大的HTTP请求功能&#xff0c;使得发送请求和处理响应变得简单。高效的数据处理&#xff1a;Java的数据处理能力&#xff0c;结…

如何给手机换ip地址

在当今数字化时代&#xff0c;IP地址作为设备在网络中的唯一标识&#xff0c;扮演着举足轻重的角色。然而&#xff0c;有时出于隐私保护、网络访问需求或其他特定原因&#xff0c;我们可能需要更改手机的IP地址。本文将详细介绍几种实用的方法&#xff0c;帮助您轻松实现手机IP…

计算力学|采用python进行有限元模拟

从abaqus输出的inp文件中读取节点和单元信息 import meshio mesh meshio.read(Job-3.inp) coords mesh.points###coords即为各个节点的坐标 Edof mesh.cells_dict[triangle]#Edof为三角形单元的节点号 1.单元刚度矩阵 def element_stiffness(n1,coords,E,v,t): node1 c…

目标检测——Cascade R-CNN算法解读

论文&#xff1a; Cascade R-CNN: Delving into High Quality Object Detection (2017.12.3) 链接&#xff1a;https://arxiv.org/abs/1712.00726 Cascade R-CNN: High Quality Object Detection and Instance Segmentation (2019.6.24) 链接&#xff1a;https://arxiv.org/abs…

ubuntu22.04下GStreamer源码编译单步调试

前言 本文会通过介绍在linux平台下的GStreamer的源码编译和单步调试example实例。官网介绍直接通过命令行来安装gstreamer可以参考链接&#xff1a;Installing on Linux。 这种方法安装后&#xff0c;基于gstreamer的程序&#xff0c;单步调试的时候并不会进入到gstreamer源码…

LSTM预测:糖尿病的发生情况

本文为为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 本期&#xff0c;做个二维结构化数据的分类预测。提到结构化数据&#xff0c;一般的分类算法常用有&#xff1a;逻辑回归&#xff08;二分类&#xff09;、KNN、SVM、决策树、贝叶斯、随机森林、X…

Jenkins配置流水线任务-实践操作(Pipeline-script)

Jenkins配置流水线任务-实践操作(Pipeline-script) 1、新增jenkins 任务&#xff0c;选择流水线 2、参数化 3、流水线配置 pipeline {agent anystages {stage(aoePlugin_mysql) {steps {echo "xxx&#xff0c;数据库:Mysql"echo "${HOST},${USER_NAME}"b…

王爽汇编语言第三版实验1

前言 本系列的文章是对王爽老师的汇编语言中的实验的解答记录&#xff0c;原书一共有17个实验&#xff0c;由于学校的教学流程只做到了第14个实验&#xff0c;因此本文章只会有前十四个实验的解答记录,还有个比较重要的是&#xff0c;文章中会有原书实验中没有的题目&#xff…

C语言 | Leetcode C语言题解之第477题汉明距离总和

题目&#xff1a; 题解&#xff1a; int totalHammingDistance(int* nums, int numsSize) {int ans 0;for (int i 0; i < 30; i) {int c 0;for (int j 0; j < numsSize; j) {c (nums[j] >> i) & 1;}ans c * (numsSize - c);}return ans; }

element plus的el-select分页

摘要&#xff1a; el-select的数据比较多的时候&#xff0c;必须要分页&#xff0c;处理方案有全部数据回来&#xff0c;或者添加搜索功能&#xff0c;但是就有个问题就是编辑的时候回显问题&#xff0c;必须要保证select的数据有对应的id与name匹配回显&#xff01; <el-fo…

如何用pyhton修改1000+图片的名字?

import os oldpath input("请输入文件路径&#xff08;在windows中复制那个图片文件夹的路径就可以):") #注意window系统中的路径用这个‘\分割&#xff0c;但是编程语言中一般都是正斜杠也就是’/‘ #这里写一个代码&#xff0c;将 \ > / path "" fo…

数字图像处理:图像复原应用

数字图像处理&#xff1a;图像复原应用 1.1 什么是图像复原&#xff1f; 图像复原是图像处理中的一个重要领域&#xff0c;旨在从退化&#xff08;例如噪声、模糊等&#xff09;图像中恢复出尽可能接近原始图像的结果。图像复原与图像增强不同&#xff0c;复原更多地依赖于图…

服务器数据恢复—服务器硬盘指示灯亮黄灯,raid崩溃的数据恢复案例

服务器数据恢复环境&#xff1a; 一台浪潮服务器中有一组由6块SAS硬盘组建的RAID。服务器上划分了1个卷&#xff0c;存放Oracle数据库文件。 服务器故障&检测&#xff1a; 服务器上有两个硬盘指示灯亮黄灯&#xff0c;RAID崩溃&#xff0c;服务器不可用。 将故障服务器中所…

LLM:deepspeed zero-2时模型训练所占显存分析

前置&#xff1a; fp16占2字节&#xff0c;fp32占4字节。换算就是1B的参数量&#xff0c;以fp16表示&#xff0c;占2G的内存。 模型参数为32B 全量微调&#xff1a; 模型参数&#xff1a;fp16的模型前向传播副本。fp32的模型的优化参数副本。这就是322324192G 梯度&#xff…

Jmeter简介

基础介绍 Jmeter录制脚本的原始是配置一个HTTP代理&#xff0c;然后浏览器通过这个代理访问测试页面从而完成脚本录制。 一、下载安装 jmeter本身不需要安装&#xff0c;需要配置环境变量JDK&#xff0c;然后打开bin文件夹中的jmeter.vbs即可。建议jdk 1.7及以上版本。 基本祖…

CVE-2024-22120:Zabbix低权限SQL注入至RCE+权限绕过

所有利用代码&#xff1a; GitHub - W01fh4cker/CVE-2024-22120-RCE: Time Based SQL Injection in Zabbix Server Audit Log --> RCE 一、漏洞环境搭建 1.1 下载vmware镜像并设置 直接懒人一键搭建&#xff1a; https://cdn.zabbix.com/zabbix/appliances/stable/6.0/6.0…

得物App3D创新应用引关注,世界设计之都大会启幕

近日&#xff0c;2024世界设计之都大会&#xff08;WDCC&#xff09;在上海盛大启幕。此次大会以“设计无界 新质生长”为主题&#xff0c;汇聚了全球设计领域的精英与前沿成果&#xff0c;展现了设计作为新质生产力的巨大潜力。主场展览占据了整整3个楼面&#xff0c;总面积达…

k8s-对命名空间资源配额

对k8s命名空间限制的方法有很多种&#xff0c;今天来演示一下很常用的一种 用的k8s对象就是ResourceQuota 一&#xff1a;创建命名空间 kubectl create ns test #namespace命名空间可以简写成ns 二&#xff1a; 对命名空间进行限制 创建resourcequota vim resourcequ…

基于Javaweb的医院挂号预约管理系统

系统展示 用户前台界面 管理员后台界面 医生后台界面 系统背景 在现代社会&#xff0c;随着医疗需求的不断增长&#xff0c;病患挂号成为医院面临的一大挑战。传统的挂号方式不仅耗时耗力&#xff0c;还容易引发混乱和不满。病患需要排队等候&#xff0c;挂号过程繁琐&#xff…