【小白学Python】自定义图片的生成(一)
【小白学Python】自定义图片的生成(二)
【小白学Python】爬取数据(三)
目录
- ai文生图接口的获取
- python中调用ai接口
- 图片拼接
- 先将图片缩放
- 拼接图片
- 文字背景图代码
- 效果图
- 总结
在之前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 = 600new_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, 300image = 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) / 2y = (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.5draw.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的理解大多数都出现了偏差,图片的生成比较随意,需要我的下一步优化。