13
13
import ahocorasick
14
14
import asyncio
15
15
import yaml
16
+ import aiofiles
17
+ import uuid
16
18
try :
17
19
import hjson as json
18
20
except :
26
28
if not exists (save_image_path ):
27
29
os .mkdir (save_image_path ) #创建img保存目录
28
30
31
+ temp_image_path = join (curpath ,'TempImage' ) # 保存临时图片路径
32
+ if not exists (temp_image_path ):
33
+ os .mkdir (temp_image_path ) #创建临时img保存目录
34
+
29
35
30
36
with open (config_path ,encoding = "utf-8" ) as f : #初始化配置文件
31
37
config = yaml .safe_load (f )#读取配置文件
@@ -56,7 +62,7 @@ async def process_tags(gid,uid,tags,add_db=config['add_db'],trans=config['trans'
56
62
try :
57
63
tags = f"tags={ tags .strip ().lower ()} " #去除首尾空格换行#转小写#头部加上tags= #转小写方便处理
58
64
taglist = re .split ('&' ,tags ) #分割
59
- id = ["tags=" ,"ntags=" ,"seed=" ,"scale=" ,"shape=" ,"strength=" ,"r18=" ]
65
+ id = ["tags=" ,"ntags=" ,"seed=" ,"scale=" ,"shape=" ,"strength=" ,"r18=" , "steps=" , "sampler=" , "restore_faces=" , "tiling=" ]
60
66
tag_dict = {i : ("" if not [idx for idx in taglist if idx .startswith (i )] else [idx for idx in taglist if idx .startswith (i )][- 1 ]).replace (i , '' , 1 ) for i in id }#取出tags+ntags+seed+scale+shape,每种只取列表最后一个,并删掉id
61
67
except Exception as e :
62
68
error_msg = error_msg .join (f"tags初始化失败{ e } " )
@@ -100,6 +106,8 @@ async def process_tags(gid,uid,tags,add_db=config['add_db'],trans=config['trans'
100
106
tag_dict ["tags=" ] = config ['tags_moren' ]#默认正面tags
101
107
if not tag_dict ["ntags=" ]:
102
108
tag_dict ["ntags=" ] = config ['ntags_moren' ]#默认负面tags
109
+ if not config ["ntags_safe" ]:
110
+ tag_dict ["ntags=" ] = config ["ntags_safe" ].join (f",{ tag_dict ['ntags=' ]} " )#默认安全负面tags
103
111
if not tag_dict ["scale=" ]:
104
112
tag_dict ["scale=" ] = config ['scale_moren' ]#默认scale
105
113
if tag_dict ["shape=" ] and tag_dict ["shape=" ].capitalize () in ["Portrait" ,"Landscape" ,"Square" ]:
@@ -108,6 +116,14 @@ async def process_tags(gid,uid,tags,add_db=config['add_db'],trans=config['trans'
108
116
tag_dict ["shape=" ] = config ['shape_moren' ]#默认形状
109
117
if not tag_dict ["r18=" ]:
110
118
tag_dict ["r18=" ] = config ['r18_moren' ]#默认r18参数
119
+ if not tag_dict ["steps=" ]:
120
+ tag_dict ["steps=" ] = "30" #默认steps
121
+ if not tag_dict ["sampler=" ]:
122
+ tag_dict ["sampler=" ] = "Euler a" #默认sampler
123
+ if not tag_dict ["restore_faces=" ] and tag_dict ["restore_faces=" ] != "True" :
124
+ tag_dict ["restore_faces=" ] = False #默认restore_faces
125
+ if not tag_dict ["tiling=" ] and tag_dict ["tiling=" ] != "True" :
126
+ tag_dict ["tiling=" ] = False #默认tiling
111
127
#上传XP数据库
112
128
if add_db :
113
129
try :
@@ -127,7 +143,28 @@ async def retry_get_ip_token(i):
127
143
return api_ip ,token
128
144
129
145
#pic本地保存
130
- #pic_id
146
+ #pid
147
+ async def pic_save_temp (imagedata ):
148
+ pid = str (uuid .uuid4 ())
149
+ async with aiofiles .open (f"{ temp_image_path } /{ pid } .png" , 'wb' ) as f :
150
+ await f .write (imagedata )
151
+ return pid
152
+
153
+ async def get_pic_msg_temp (msg ):
154
+ pid = re .search (r"pid:+([a-z0-9-]{36})" ,str (msg ))[1 ]
155
+ try :
156
+ img = Image .open (f"{ temp_image_path } /{ pid } .png" )
157
+ except :
158
+ return f"找不到这个图片涅~"
159
+ parameters = re .search (r"(.+)\nNegative prompt: +(.+)\nSteps: +(.+), Sampler: +(.+), CFG scale: +(.+), Seed: +(.+), Size: +(.+), Model hash: +(.{8})" ,img .info ["parameters" ])
160
+ msg = f'''
161
+ ▲prompt: { parameters [1 ]}
162
+ ▼Negative prompt: { parameters [2 ]}
163
+ Steps:{ parameters [3 ]} Sampler:{ parameters [4 ]}
164
+ CFG scale:{ parameters [5 ]} seed:{ parameters [6 ]}
165
+ Size:{ parameters [7 ]} Model hash:{ parameters [8 ]} '''
166
+ return msg
167
+
131
168
132
169
133
170
async def get_imgdata_sd (tagdict :dict ,way = 1 ,shape = "Portrait" ,b_io = None ,size = None ):
@@ -138,28 +175,36 @@ async def get_imgdata_sd(tagdict:dict,way=1,shape="Portrait",b_io=None,size = No
138
175
width ,height = size
139
176
if not tagdict ["strength=" ]:
140
177
tagdict ["strength=" ] = config ['strength_moren' ]#默认噪声
178
+ if not tagdict ["seed=" ]:
179
+ tagdict ["seed=" ] = - 1
141
180
json_data = {
142
181
"init_images" : data ,
143
182
"resize_mode" : 0 ,
144
183
"denoising_strength" : tagdict ["strength=" ],
145
184
"prompt" : tagdict ["tags=" ],
146
- "seed" : - 1 ,
147
- "steps" : 50 ,
185
+ "seed" : tagdict [ "seed=" ] ,
186
+ "steps" : tagdict [ "steps=" ] ,
148
187
"cfg_scale" : tagdict ["scale=" ],
149
188
"width" : width ,
150
189
"height" : height ,
190
+ "restore_faces" : tagdict ["restore_faces=" ],
191
+ "tiling" : tagdict ["tiling=" ],
151
192
"negative_prompt" : tagdict ["ntags=" ],
152
- "sampler_index" : "Euler"
193
+ "sampler_index" : tagdict [ "sampler=" ]
153
194
}
154
195
response = await aiorequests .post (url ,json = json_data ,headers = {"Content-Type" : "application/json" })
155
196
imgdata = await response .json ()
156
197
imgdata = imgdata ["images" ][0 ]
198
+ try :
199
+ pid = await pic_save_temp (base64 .b64decode (imgdata ))
200
+ except Exception as e :
201
+ print (f"!!!保存失败{ e } " )
157
202
try :
158
203
imgmes = 'base64://' + imgdata
159
204
except Exception as e :
160
205
error_msg = error_msg .join ("处理图像失败{e}" )
161
206
return result_msg ,error_msg
162
- result_msg = f"[CQ:image,file={ imgmes } ]\n tags: { tagdict [ 'tags=' ] } "
207
+ result_msg = f"[CQ:image,file={ imgmes } ]\n pid: { pid } "
163
208
return result_msg ,error_msg
164
209
165
210
@@ -186,7 +231,6 @@ async def get_imgdata(tagdict:dict,way=1,shape="Portrait",b_io=None):#way=1时
186
231
response = await aiorequests .get (url , timeout = 180 )
187
232
else :
188
233
url = (f"http://{ api_ip } /got_image2image" ) + (f"?tags={ tags } " )+ (f"&token={ token } " )
189
-
190
234
response = await aiorequests .post (url ,data = b64encode (b_io .getvalue ()), timeout = 180 )
191
235
imgdata = await response .content
192
236
if len (imgdata ) < 5000 :
@@ -204,6 +248,10 @@ async def get_imgdata(tagdict:dict,way=1,shape="Portrait",b_io=None):#way=1时
204
248
except Exception as e :
205
249
error_msg = f"获取图片信息失败"
206
250
return result_msg ,error_msg
251
+ try :
252
+ pid = await pic_save_temp (imgdata )
253
+ except Exception as e :
254
+ print (f"!!!保存失败{ e } " )
207
255
try :
208
256
img = Image .open (BytesIO (imgdata ))
209
257
buffer = BytesIO () # 创建缓存
@@ -212,7 +260,7 @@ async def get_imgdata(tagdict:dict,way=1,shape="Portrait",b_io=None):#way=1时
212
260
except Exception as e :
213
261
error_msg = error_msg .join ("处理图像失败{e}" )
214
262
return result_msg ,error_msg
215
- result_msg = f"[CQ:image,file={ imgmes } ]{ msg } \n tags: { tags } "
263
+ result_msg = f"[CQ:image,file={ imgmes } ]{ msg } \n pid: { pid } "
216
264
return result_msg ,error_msg
217
265
218
266
@@ -267,7 +315,6 @@ async def get_pic_d(msg):
267
315
img_data = await aiorequests .get (url )
268
316
image = Image .open (BytesIO (await img_data .content ))
269
317
a ,b = image .size
270
- print (f"原尺寸{ a } x{ b } !!!!!!!!!!!!!" )
271
318
c = a / b
272
319
s = [0.6667 ,1.5 ,1 ]
273
320
n = 1000000 #最大像素
@@ -276,7 +323,6 @@ async def get_pic_d(msg):
276
323
a = math .ceil (c * b )
277
324
a = math .ceil (a / 64 )* 64
278
325
b = math .ceil (b / 64 )* 64 #等比缩放为64的倍数
279
- print (f"新尺寸{ a } x{ b } !!!!!!!!!!!!!" )
280
326
size = (a ,b )
281
327
s1 = ["Portrait" ,"Landscape" ,"Square" ]
282
328
shape = s1 [s .index (nsmallest (1 , s , key = lambda x : abs (x - c ))[0 ])]#判断形状
@@ -465,6 +511,10 @@ async def get_imgdata_magic(tags):#way=1时为get,way=0时为post
465
511
continue
466
512
i = 999
467
513
error_msg = ""
514
+ try :
515
+ pid = await pic_save_temp (imgdata )
516
+ except Exception as e :
517
+ print (f"!!!保存失败{ e } " )
468
518
try :
469
519
img = Image .open (BytesIO (imgdata )).convert ("RGB" )
470
520
buffer = BytesIO () # 创建缓存
@@ -473,5 +523,5 @@ async def get_imgdata_magic(tags):#way=1时为get,way=0时为post
473
523
except Exception as e :
474
524
error_msg = error_msg .join ("处理图像失败{e}" )
475
525
return result_msg ,error_msg
476
- result_msg = f"[CQ:image,file={ imgmes } ]"
526
+ result_msg = f"[CQ:image,file={ imgmes } ]\n pid: { pid } "
477
527
return result_msg ,error_msg
0 commit comments