一尘不染

如何调整图像大小以保持其边框的厚度?

javascript

我正在为 Python Arcade 库制作一个 GUI 工具包,但我遇到了一个问题。我希望用户能够以像素(宽度、高度)为单位自定义 GUI 小部件和图形的大小。但目前,图形是图像。我有图片,但我希望用户能够自定义他们的尺寸。

其中一张图片如下所示。我需要其他东西,而不是使用 PIL 来拉伸图像的宽度和高度。只是拉伸宽度和高度会使边框看起来太厚。

条目小部件

有没有一种简单的方法可以剪切图像的某些部分以方便使用来扩展它?边框看起来像这样。它们将被拆分以扩展图像。有些部分可以拉伸,有些则不能。

img


阅读 114

收藏
2022-10-08

共1个答案

一尘不染

调整大小似乎不是简单的方法(液体调整大小在这里不起作用)除了(如第二张图片的问题中所建议的那样)使用 PIL 将图像crop()分成九 (9) 个子图像并分别调整它们的大小(除了角子图像,不会调整大小)。然后使用 PIL 将调整大小的部分粘贴到具有请求的新大小的新图像中paste()。边界仅沿其长度而不是沿其厚度拉伸。如果使用进一步向下提供的resizeExceptBorder()功能调整原始图像的大小,则如下所示:

原始图像原始图像 (200 x 30)

new_img_1 = resizeExceptBorder(PIL_image,(300,90),(5,5,5,5))

调整大小的图像 1调整大小的图像 (300 x 90)

new_img_2 = resizeExceptBorder(PIL_image,(400,150),(5,5,5,5))

调整大小的图像 2调整大小 (400 x 150)

这里是我为此目的编写的函数代码:

def resizeExceptBorder(PIL_image, newSize, borderWidths):
    """ 
    newSize = (new_width, new_height)
    borderWidths = (leftWidth, rightWidth, topWidth, bottomWidth)"""
    pl_img = PIL_image
    sXr, sYr = newSize # ( 800, 120 ) # resized size X, Y
    lWx, rWx , tWy, bWy  = borderWidths

    sX,  sY  = pl_img.size
    sXi, sYi = sXr-(lWx+rWx), sYr-(tWy+bWy)

    pl_lft_top = pl_img.crop((     0,     0,    lWx, tWy)) 
    pl_rgt_top = pl_img.crop((sX-rWx,     0,    sX,  tWy))
    pl_lft_btm = pl_img.crop((     0, sY-bWy,   lWx,  sY))
    pl_rgt_btm = pl_img.crop((sX-rWx, sY-bWy,    sX,  sY))
    # ---
    pl_lft_lft = pl_img.crop((     0,    tWy,    lWx,sY-bWy)).resize((lWx ,sYi))
    pl_rgt_rgt = pl_img.crop((sX-rWx,    tWy,     sX,sY-bWy)).resize((rWx ,sYi))
    pl_top_top = pl_img.crop((   lWx,      0, sX-rWx,   tWy)).resize((sXi ,tWy))
    pl_btm_btm = pl_img.crop((   lWx, sY-bWy, sX-rWx,    sY)).resize((sXi ,bWy))
    # ---
    pl_mid_mid = pl_img.crop((   lWx,    tWy, sX-rWx,sY-bWy)).resize((sXi,sYi))
    # -------
    pl_new=Image.new(pl_img.mode, (sXr, sYr)) 
    # ---
    pl_new.paste(pl_mid_mid, (    lWx,    tWy))
    # ---
    pl_new.paste(pl_top_top, (    lWx,      0))
    pl_new.paste(pl_btm_btm, (    lWx,sYr-bWy))
    pl_new.paste(pl_lft_lft, (      0,    tWy))
    pl_new.paste(pl_rgt_rgt, (sXr-rWx,    tWy))
    # ---
    pl_new.paste(pl_lft_top, (      0,     0))
    pl_new.paste(pl_rgt_top, (sXr-rWx,     0))
    pl_new.paste(pl_lft_btm, (      0,sYr-bWy))
    pl_new.paste(pl_rgt_btm, (sXr-rWx,sYr-bWy))
    # ---
    return pl_new
#:def
2022-10-08