How to draw text with image in background

前端 未结 1 874
刺人心
刺人心 2020-12-22 06:53

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条回答
  • 2020-12-22 07:45

    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:

    0 讨论(0)
提交回复
热议问题