2023-02-13 23:34:42 +00:00
|
|
|
from logging import getLogger
|
|
|
|
from typing import List, Optional
|
|
|
|
|
|
|
|
from PIL import Image
|
|
|
|
|
2023-02-27 02:09:42 +00:00
|
|
|
from ..image import valid_image
|
|
|
|
from ..output import save_image
|
2023-02-13 23:34:42 +00:00
|
|
|
from ..params import ImageParams, StageParams
|
2023-02-26 05:49:39 +00:00
|
|
|
from ..server import ServerContext
|
2023-02-19 02:28:21 +00:00
|
|
|
from ..utils import is_debug
|
2023-02-26 20:15:30 +00:00
|
|
|
from ..worker import ProgressCallback, WorkerContext
|
2023-02-13 23:34:42 +00:00
|
|
|
|
|
|
|
logger = getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
|
def blend_mask(
|
2023-02-26 05:49:39 +00:00
|
|
|
_job: WorkerContext,
|
2023-02-13 23:34:42 +00:00
|
|
|
server: ServerContext,
|
|
|
|
_stage: StageParams,
|
|
|
|
_params: ImageParams,
|
|
|
|
*,
|
2023-02-18 22:27:48 +00:00
|
|
|
sources: Optional[List[Image.Image]] = None,
|
2023-02-19 04:11:44 +00:00
|
|
|
stage_mask: Optional[Image.Image] = None,
|
2023-03-01 03:44:52 +00:00
|
|
|
_callback: Optional[ProgressCallback] = None,
|
2023-02-13 23:34:42 +00:00
|
|
|
**kwargs,
|
|
|
|
) -> Image.Image:
|
|
|
|
logger.info("blending image using mask")
|
|
|
|
|
2023-02-19 04:11:44 +00:00
|
|
|
mult_mask = Image.new("RGBA", stage_mask.size, color="black")
|
|
|
|
mult_mask.alpha_composite(stage_mask)
|
2023-02-14 03:57:47 +00:00
|
|
|
mult_mask = mult_mask.convert("L")
|
2023-02-13 23:34:42 +00:00
|
|
|
|
|
|
|
if is_debug():
|
2023-02-19 04:11:44 +00:00
|
|
|
save_image(server, "last-mask.png", stage_mask)
|
2023-02-14 03:57:47 +00:00
|
|
|
save_image(server, "last-mult-mask.png", mult_mask)
|
2023-02-13 23:34:42 +00:00
|
|
|
|
2023-02-18 15:25:01 +00:00
|
|
|
resized = [
|
|
|
|
valid_image(s, min_dims=mult_mask.size, max_dims=mult_mask.size)
|
2023-02-18 22:27:48 +00:00
|
|
|
for s in sources
|
2023-02-18 15:25:01 +00:00
|
|
|
]
|
2023-02-14 03:57:47 +00:00
|
|
|
|
2023-02-19 17:04:11 +00:00
|
|
|
return Image.composite(resized[1], resized[0], mult_mask)
|