这是我发现使用此处和此处Image.composite()记录的函数来实现此目的的一种方法。
在对问题Is it possible to mask an image in Python Imaging Library (PIL)? 的回答中(非常)简洁地描述了所使用的方法。作者:@Mark Ransom\xe2\x80\xa6 以下只是应用它来完成您想要做的事情的说明。
from PIL import Image, ImageDraw, ImageFont\n\nBACKGROUND_IMAGE_FILENAME = \'cookie_cutter_background_cropped.png\'\nRESULT_IMAGE_FILENAME = \'cookie_cutter_text_result.png\'\nTHE_TEXT = \'LOADED\'\nFONT_NAME = \'arialbd.ttf\' # Arial Bold\n\n# Read the background image and convert to an RGB image with Alpha.\nwith open(BACKGROUND_IMAGE_FILENAME, \'rb\') as file:\n bgr_img = Image.open(file)\n bgr_img = bgr_img.convert(\'RGBA\') # Give iamge an alpha channel.\n bgr_img_width, bgr_img_height = bgr_img.size\n cx, cy = bgr_img_width//2, bgr_img_height//2 # Center of image.\n\n# Create a transparent foreground to be result of non-text areas.\nfgr_img = Image.new(\'RGBA\', bgr_img.size, color=(0, 0, 0, 0))\n\nfont_size = bgr_img_width//len(THE_TEXT)\nfont = ImageFont.truetype(FONT_NAME, font_size)\n\ntxt_width, txt_height = font.getsize(THE_TEXT) # Size of text w/font if rendered.\ntx, ty = cx - txt_width//2, cy - txt_height//2 # Center of text.\n\nmask_img = Image.new(\'L\', bgr_img.size, color=255)\nmask_img_draw = ImageDraw.Draw(mask_img)\nmask_img_draw.text((tx, ty), THE_TEXT, fill=0, font=font, align=\'center\')\n\nres_img = Image.composite(fgr_img, bgr_img, mask_img)\nres_img.save(RESULT_IMAGE_FILENAME)\nres_img.show()\nRun Code Online (Sandbox Code Playgroud)\n其中,使用以下内容BACKGROUND_IMAGE:
生成了如下所示的图像,这是在 Photoshop 中查看的图像,因此它的透明背景是可以辨别的(未按比例):
\n\n这是放大图,显示了平滑渲染的角色边缘:
\n\n