【小白學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的理解大多數都出現了偏差,圖片的生成比較隨意,需要我的下一步優化。