问题
I want to make something like this python.
I have the image in background and write text with transparent fill, so that image shows up.
回答1:
Here's one way I found to do it using the Image.composite()
function which is documented here and here.
The approach used is described (very) tersely in this answer to the question
Is it possible to mask an image in Python Imaging Library (PIL)? by @Mark Ransom…the following is just an illustration of applying it to accomplish what you want do.
from PIL import Image, ImageDraw, ImageFont
BACKGROUND_IMAGE_FILENAME = 'cookie_cutter_background_cropped.png'
RESULT_IMAGE_FILENAME = 'cookie_cutter_text_result.png'
THE_TEXT = 'LOADED'
FONT_NAME = 'arialbd.ttf' # Arial Bold
# Read the background image and convert to an image with alpha.
with open(BACKGROUND_IMAGE_FILENAME, 'rb') as file:
bgr_img = Image.open(file)
bgr_img = bgr_img.convert('RGBA') # Make sure it has alpha.
bgr_img_width, bgr_img_height = bgr_img.size
cx, cy = bgr_img.size[0] // 2, bgr_img.size[1] // 2 # Image center.
# Create a transparent foreground to be result of non-text areas.
fgr_img = Image.new('RGBA', bgr_img.size, color=(0,0,0,0))
# Create a mask layer and render the text string onto it.
font_size = bgr_img_width // len(THE_TEXT)
font = ImageFont.truetype(FONT_NAME, font_size)
txt_width, txt_height = font.getsize(THE_TEXT)
tx, ty = cx - txt_width//2, cy - txt_height//2 # Center text.
mask_img = Image.new('L', bgr_img.size, color=255)
mask_img_draw = ImageDraw.Draw(mask_img)
mask_img_draw.text((tx, ty), THE_TEXT, fill=0, font=font, align='center')
res_img = Image.composite(fgr_img, bgr_img, mask_img)
res_img.save(RESULT_IMAGE_FILENAME)
res_img.show()
Which, using the following BACKGROUND_IMAGE
:
produced the image shown below, which is it being viewed in Photoshop so the transparent background it has would be discernible (not to scale):
Here's an enlargement, showing the smoothly rendered edges of the characters:
来源:https://stackoverflow.com/questions/50297272/how-to-draw-text-with-image-in-background