Question summary:我的预期结果是,无论背景图像的宽度和高度如何,水印都能以对角线为框架,始终符合限制条件,并且尺寸能保持徽标的质量.


为了不丢失我用作水印的图像的质量,我不得不从我要粘贴它的图像的宽度重新调整它的大小,但正如你在我将在代码下面发布的图像中所看到的,当图像的高度太小时,水印超出了图像的限制.

如果我需要根据另一幅图像的宽度来调整水印以保持质量,我应该如何调整高度和宽度,以便水印完全适合另一幅图像,而不管其高度或宽度如何?

from PIL import Image

def watermark_with_transparency(input_image_path,
                                output_image_path,
                                watermark_image_path):
    
    TRANSPARENCY = 20
    angle = 30

    base_image = Image.open(input_image_path)
    w_img, h_img = base_image.size
    
    basewidth = w_img
    watermark = Image.open(watermark_image_path)
    wpercent = (basewidth/float(watermark.size[0]))
    hsize = int((float(watermark.size[1])*float(wpercent)))
    watermark = watermark.resize((basewidth,hsize), Image.ANTIALIAS)
    watermark = watermark.rotate( angle, expand=1 )
    w_logo, h_logo = watermark.size

    center_y = int(h_img / 2)
    center_x = int(w_img / 2)
    top_y = center_y - int(h_logo / 2)
    left_x = center_x - int(w_logo / 2)

    if watermark.mode!='RGBA':
        alpha = Image.new('L', (w_img, h_img), 255)
        watermark.putalpha(alpha)

    paste_mask = watermark.split()[3].point(lambda i: i * TRANSPARENCY / 100.)
    base_image.paste(watermark, (left_x,top_y), mask=paste_mask)
    base_image.show()
    base_image.save(output_image_path)

if __name__ == '__main__':
    watermark_with_transparency(
        'jogos_de_hoje_na_tv.png',
        'watermark_create.png',
        'logo_com_transparencia.png'
        )

Current result:

enter image description here




我试着添加这样的宽度:

    basehight = h_img
    hpercent = (basehight/float(watermark.size[0]))
    wsize = int((float(watermark.size[0])*float(hpercent)))

    watermark = watermark.resize((wsize,hsize), Image.ANTIALIAS)

但结果是一个高度很大的水印,在尺寸调整上没有任何质量.

推荐答案

我会这样修改你的代码:

def watermark_with_transparency(input_image_path,
                                output_image_path,
                                watermark_image_path):
    TRANSPARENCY = 20
    angle = 30
    base_image = Image.open(input_image_path)
    base_image.show()
    w_img, h_img = base_image.size
    basewidth = w_img
    watermark = Image.open(watermark_image_path)
    watermark = watermark.rotate(angle, expand=True)
    wpercent = (basewidth / float(watermark.size[0]))
    hpercent = h_img / float(watermark.size[1])
    if wpercent < hpercent:
        hsize = int((float(watermark.size[1]) * float(wpercent)))
        watermark = watermark.resize((basewidth, hsize), Image.ANTIALIAS)
    else:
        wsize = int((float(watermark.size[0]) * float(hpercent)))
        watermark = watermark.resize((wsize, h_img), Image.ANTIALIAS)
    w_logo, h_logo = watermark.size
    center_y = int(h_img / 2)
    center_x = int(w_img / 2)
    top_y = center_y - int(h_logo / 2)
    left_x = center_x - int(w_logo / 2)
    if watermark.mode != 'RGBA':
        alpha = Image.new('L', (w_img, h_img), 255)
        watermark.putalpha(alpha)
    paste_mask = watermark.split()[3].point(lambda i: i * TRANSPARENCY / 100.)
    base_image.paste(watermark, (left_x, top_y), mask=paste_mask)
    base_image.show()
    base_image.save(output_image_path)

这个 idea 是,当你调整水印大小时,你必须判断哪个因素(高度或宽度)是最小的,并且你想要接受它.否则,在第一个版本的代码中,调整大小时没有考虑到新高度可能大于输入图像高度.

Python相关问答推荐

在Python中添加期货之间的延迟

根据多列和一些条件创建新列

Python中的Pool.starmap异常处理

删除pandas rame时间序列列中未更改的值

使用argsorted索引子集索引数组

过滤绕轴旋转的螺旋桨

GL pygame无法让缓冲区与vertextPointer和colorPointer一起可靠地工作

Python会扔掉未使用的表情吗?

如何在具有重复数据的pandas中对groupby进行总和,同时保留其他列

Polars比较了两个预设-有没有方法在第一次不匹配时立即失败

如何将双框框列中的成对变成两个新列

未删除映射表的行

如何让Flask 中的请求标签发挥作用

Python+线程\TrocessPoolExecutor

如何根据一列的值有条件地 Select 前N组?

Python全局变量递归得到不同的结果

matplotlib + python foor loop

pandas:对多级列框架的列进行排序/重新排序

重置PD帧中的值

OpenGL仅渲染第二个三角形,第一个三角形不可见