@ -64,7 +64,7 @@ class PromptServer():
def __init__ ( self , loop ) :
PromptServer . instance = self
mimetypes . init ( ) ;
mimetypes . init ( )
mimetypes . types_map [ ' .js ' ] = ' application/javascript; charset=utf-8 '
self . prompt_queue = None
self . loop = loop
@ -186,18 +186,43 @@ class PromptServer():
post = await request . post ( )
return image_upload ( post )
@routes . post ( " /upload/mask " )
async def upload_mask ( request ) :
post = await request . post ( )
def image_save_function ( image , post , filepath ) :
original_pil = Image . open ( post . get ( " original_image " ) . file ) . convert ( ' RGBA ' )
mask_pil = Image . open ( image . file ) . convert ( ' RGBA ' )
original_ref = json . loads ( post . get ( " original_ref " ) )
filename , output_dir = folder_paths . annotated_filepath ( original_ref [ ' filename ' ] )
# validation for security: prevent accessing arbitrary path
if filename [ 0 ] == ' / ' or ' .. ' in filename :
return web . Response ( status = 400 )
if output_dir is None :
type = original_ref . get ( " type " , " output " )
output_dir = folder_paths . get_directory_by_type ( type )
if output_dir is None :
return web . Response ( status = 400 )
if original_ref . get ( " subfolder " , " " ) != " " :
full_output_dir = os . path . join ( output_dir , original_ref [ " subfolder " ] )
if os . path . commonpath ( ( os . path . abspath ( full_output_dir ) , output_dir ) ) != output_dir :
return web . Response ( status = 403 )
output_dir = full_output_dir
# alpha copy
new_alpha = mask_pil . getchannel ( ' A ' )
original_pil . putalpha ( new_alpha )
original_pil . save ( filepath , compress_level = 4 )
file = os . path . join ( output_dir , filename )
if os . path . isfile ( file ) :
with Image . open ( file ) as original_pil :
original_pil = original_pil . convert ( ' RGBA ' )
mask_pil = Image . open ( image . file ) . convert ( ' RGBA ' )
# alpha copy
new_alpha = mask_pil . getchannel ( ' A ' )
original_pil . putalpha ( new_alpha )
original_pil . save ( filepath , compress_level = 4 )
return image_upload ( post , image_save_function )
@ -231,9 +256,8 @@ class PromptServer():
if ' preview ' in request . rel_url . query :
with Image . open ( file ) as img :
preview_info = request . rel_url . query [ ' preview ' ] . split ( ' ; ' )
image_format = preview_info [ 0 ]
if image_format not in [ ' webp ' , ' jpeg ' ] :
if image_format not in [ ' webp ' , ' jpeg ' ] or ' a ' in request . rel_url . query . get ( ' channel ' , ' ' ) :
image_format = ' webp '
quality = 90
@ -241,7 +265,7 @@ class PromptServer():
quality = int ( preview_info [ - 1 ] )
buffer = BytesIO ( )
if image_format in [ ' jpeg ' ] :
if image_format in [ ' jpeg ' ] or request . rel_url . query . get ( ' channel ' , ' ' ) == ' rgb ' :
img = img . convert ( " RGB " )
img . save ( buffer , format = image_format , quality = quality )
buffer . seek ( 0 )