extenew
/
extensions
/automatic1111-extension-custom-text-overlay
/lib
/custom_text_overlay
/drawText.py
from PIL import Image, ImageDraw, ImageFont, ImageColor | |
from lib.custom_text_overlay.align import align, Position, getTextAlignFromPosition | |
from lib.custom_text_overlay.logger import logger | |
from lib.custom_text_overlay.util import percentToByte | |
def drawText(img: Image.Image, text: str, fontSize: int, textColor: str, position: Position, backgroundColor: str, backgroundOpacity: int, margin: int = 0, padding: int = 8, outline: int = 0, outlineColor: str = '#000000', outlineOpacity: int = 100) -> Image.Image: | |
draw = ImageDraw.Draw(img) | |
font = ImageFont.truetype("D:/ai/automatic1111/modules/Roboto-Regular.ttf", fontSize) | |
multilineAlign = getTextAlignFromPosition(position) | |
drawTextArgs = { | |
'text': text, | |
'font': font, | |
'spacing': 0, | |
'align': multilineAlign, | |
'stroke_width': outline, | |
} | |
textBounds = draw.multiline_textbbox((0, 0), **drawTextArgs) | |
textWidth = textBounds[2] - textBounds[0] | |
textHeight = textBounds[3] - textBounds[1] | |
boxWidth = textWidth + padding * 2 | |
boxHeight = textHeight + padding * 2 | |
boxPosition = align(img.size, (boxWidth, boxHeight), position, margin) | |
textPosition = (boxPosition[0] + padding, boxPosition[1] + padding) | |
logger.debug(f'Text bounds: [x: {textPosition[0]}, y: {textPosition[1]}, width: {textWidth}, height: {textHeight}]') | |
logger.debug(f'Background bounds: [x: {boxPosition[0]}, y: {boxPosition[1]}, width: {boxWidth}, height: {boxHeight}]') | |
img = img.convert('RGBA') | |
overlay = Image.new('RGBA', img.size, (0, 0, 0, 0)) | |
overlayDraw = ImageDraw.Draw(overlay) | |
backgroundInkSolid = ImageColor.getrgb(backgroundColor) | |
backgroundInk = (*backgroundInkSolid, percentToByte(backgroundOpacity)) | |
overlayDraw.rectangle((boxPosition[0], boxPosition[1], boxPosition[0] + boxWidth, boxPosition[1] + boxHeight), fill=backgroundInk) # type: ignore | |
img = Image.alpha_composite(img, overlay) | |
img = img.convert('RGB') | |
imgDraw = ImageDraw.Draw(img) | |
outlineColorSolid = ImageColor.getrgb(outlineColor) | |
outlineColor = (*outlineColorSolid, percentToByte(outlineOpacity)) # type: ignore | |
imgDraw.multiline_text(textPosition, fill=textColor, **drawTextArgs, stroke_fill=outlineColor) | |
return img | |