如何使枕头文字不会离开屏幕

Posted

技术标签:

【中文标题】如何使枕头文字不会离开屏幕【英文标题】:How to make pillow text not get offscreen 【发布时间】:2021-10-07 02:33:00 【问题描述】:

我做了一个向图像添加文本的命令。但问题是,有时如果有人输入长消息,文本就会离开屏幕。我该如何解决这个问题?

@bot.command()
async def Picture1(ctx,*,message=None):

    member = ctx.author
    if message ==None:
        await ctx.send("You have to put a message in idiot")
        return

    text1 = str(member)
    print(text1)

    # get an image
    base = Image.open(r"C:\Users\User\Pictures\Picture.png").convert("RGBA")

    # make a blank image for the text, initialized to transparent text color
    txt = Image.new("RGBA", base.size, (255, 255, 255, 0))

    # get a font
    fnt = ImageFont.truetype(
        r"C:\Users\User\fonts\courbi.ttf", 40)
    # get a drawing context
    d = ImageDraw.Draw(txt)

    # draw text, half opacity
    d.text((21, 70), "'" + message + "'", font=fnt,
           fill=(255, 255, 255, 128))
    # draw text, full opacity
    d.text((10, 213), "-" + text1, font=fnt, fill=(255, 255, 255, 255))

    out = Image.alpha_composite(base, txt)

    out.save("picutre1.png", format="png")
    print(out.save)

    await ctx.send(file=discord.File("quote.png"))

【问题讨论】:

【参考方案1】:

使用this 回答以像素为单位计算文本的大小,然后您可以选择缩小文本或只换行。

来自该答案的内容:

import ctypes

def GetTextDimensions(text, points, font):
    class SIZE(ctypes.Structure):
        _fields_ = [("cx", ctypes.c_long), ("cy", ctypes.c_long)]

    hdc = ctypes.windll.user32.GetDC(0)
    hfont = ctypes.windll.gdi32.CreateFontA(-points, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, font)
    hfont_old = ctypes.windll.gdi32.SelectObject(hdc, hfont)
    size = SIZE(0, 0)
    ctypes.windll.gdi32.GetTextExtentPoint32A(hdc, text.encode('cp1252'), len(text), ctypes.byref(size))
    ctypes.windll.gdi32.SelectObject(hdc, hfont_old)
    ctypes.windll.gdi32.DeleteObject(hfont)
    return (size.cx, size.cy)

如果您只想使文本适合,我已经制作了一个函数来获得适合的大小:

def resizetofit(text,sz,fontname,max_horizontal):
    while True:
        width, height = GetTextDimensions(text, sz, fontname) #Get size of text
        if width < max_horizontal:
            break
        else:
            sz -= 1
    return sz

用法:textsize = resizetofit("text", default text size, "fontName", horizontal max size in pixels)

或者,如果您想在不合适的情况下换行,请告诉我,我可以尝试创建一个函数来执行此操作,但我链接的答案包含您自己制作所需的一切。

【讨论】:

以上是关于如何使枕头文字不会离开屏幕的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SpriteKit 检测节点是不是离开屏幕 [重复]

如何检查是不是有东西离开屏幕? - JFrame

拖动时如何让 UIScrollView 离开屏幕

PyGame-角色离开屏幕

如何检测自定义表格视图单元格何时离开屏幕?

怎么使js离开页面时弹出comfirm框?