【小白学Python】AI生成图片(四)

【小白学Python】自定义图片的生成(一)

【小白学Python】自定义图片的生成(二)

【小白学Python】爬取数据(三)


在之前python学习的过程中,暂时完成了以下几个步骤:

1.从某乎爬取问答,生成txt文件
2.筛选自己想要的txt数据,读取txt文件
3.根据txt文件的问答数据,生成简易的背景图片。

现在生成的背景图片都比较单一,如下:

在这里插入图片描述

正好这段时间在用一个免费的基于stabble diffusion 3模型的文生图网站,我计划对之前的图片生成的过程进行优化。

调用上述网站的ai接口,图片的上半部分基于图片中的文字生成。


ai文生图接口的获取

F12打开浏览器的开发者工具,之后在网站上写入prompt提示语,选好图片生成的配置之后,点击生成。

在这里插入图片描述

主要需要两个接口来生成图片

  • create 图片生成
  • record-detail 异步获取图片生成

python中调用ai接口

将上述接口的调用参数、地址转换为python代码如下

def createPics(prompt):
    url = ".../create"
    requestsStr = {
        "prompt": prompt,
        "negativePrompt": "",
        "model": "realistic",
        # "model": "visiCanvas",
        # "model": "oldRealistic",
        # "model": "tamarin",
        # "model": "superAnime",
        "size": "1:1",
        "batchSize": "1",
        "imageUrl": ""
    }

    response = requests.post(url, json=requestsStr, headers=headers)

    return response.json().get('data').get('recordUuid')


def getPicLinkUrl(prompt):
    recordUuid = createPics(prompt)
    picState = 'generating'
    while picState != 'success':
        url = "https://.../record-detail"
        params = {
            "recordUuid": recordUuid
        }

        response = requests.get(url, params=params)
        response = response.json()
        print(response)

        sleep(5)
        picState = response.get('data').get('picState')
    return json.loads(response.get('data').get('picUrl'))[0]['picUrl']

输入prompt参数,调用上述方法,图片生成结果如下:
在这里插入图片描述

图片拼接

AI生成的图片风格各异,如果直接当做背景图会影响文字的展示,所以将AI生成的图片,拼在之前生成的文字背景图上面,并调整图片的大小。

先将图片缩放
def editPic(prompt):
    picPath = "aipics/" + str(time.time()) + ".jpg"
    download_image(getPicLinkUrl(prompt), picPath)
    # 打开图片文件
    image = Image.open(picPath)

    # 定义缩放尺寸
    new_width = 600
    new_height = 600

    # 使用Image对象的resize方法进行缩放
    resized_image = image.resize((new_width, new_height))

    # # 保存缩放后的图片
    # resized_image.save(picPath)

    # 关闭原始图片对象(可选步骤)
    image.close()
    return resized_image
拼接图片
def mergePics(image1, image2):
    # 确保两张图片的尺寸相同(或者处理尺寸不同的情况)
    if image1.size[0] != image2.size[0]:  # 检查宽度是否相同
        raise ValueError("Images must have the same width")

    # 计算拼接后图片的尺寸
    width = image1.size[0]
    height = image1.size[1] + image2.size[1]

    # 创建一张新图片,尺寸为拼接后的尺寸
    merged_image = Image.new('RGB', (width, height))

    # 将两张图片粘贴到新图片上
    merged_image.paste(image1, (0, 0))
    merged_image.paste(image2, (0, image1.size[1]))

    # 保存拼接后的图片
    merged_image.save('pics/'+ str(time.time()) + '.jpg')

    # 显示拼接后的图片(可选)
    merged_image.show()

文字背景图代码

def draw_text(text):
    text = remove_between_chars(text, '@', ':')
    # 设置图片大小
    width, height = 600, 300
    image = Image.new('RGB', (width, height), color='black')
    # 加载字体文件,并设置字体大小
    # 注意:确保arial.ttf字体文件路径是正确的
    font = ImageFont.truetype('C:\\Windows\\Fonts\\simhei.ttf', 20)
    # font.color = 'yellow'
    # 创建画布
    draw = ImageDraw.Draw(image)
    # 使用draw的textsize方法获取文本大小
    text_width, text_height = draw.textsize(text, font=font)
    # 计算文字位置,使其居中
    x = (width - text_width) / 2
    y = (height - text_height) / 3.5

    # 此处简单处理 如果将要到达边界,往字符串指定位置增加换行符
    # 这里经过调试,我这里使用22比较合适,后续需要优化
    if text_width > width - 10:
        new_text = text[:25] + "\n\n   " + text[25:]
        # 绘制文字
        x = (width - text_width // 2) / 2.5
        draw.text((x, y), new_text, font=font, fill='white')
    else:
        # 绘制文字
        draw.text((x, y), text, font=font, fill='white')

    #ai生成的图片
    prompt = str.replace(str.replace(text, '\n', ''), 'A: ', ' ')
    image1 = editPic(prompt)
    #合并图片背景图及ai生成的图片
    mergePics(image1, image)

效果图

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

总结

由于我的原数据是爬取的QA形式,并没有经过优化,过于简洁,描述过少,其实并不适合AI文字生成图片的prompt,AI的理解大多数都出现了偏差,图片的生成比较随意,需要我的下一步优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值