图像枕头的透明边框

Transparent border of the image Pillow

我有一个 512 x 512 像素的图像列表。我只需要使每个图像的 32 个像素透明(从每一面),这样我就可以将这些图像组合成马赛克。我找到了如何改变整个图像的不透明度,但不是边框。如果有任何帮助,我会很高兴!

这是我更改不透明度的代码

for item in dem_fps:
    img = Image.open(item)
    img.putalpha(127)
img = Image.open(‘image.png’)
rgba = img.convert(“RGBA”)
data = rgba.load()
data[0,0]=(data[0,0][0],data[0,0][1],data[0,0][2],127)
img.save(filename)

此代码首先将图像转换为 RGBA,这允许我们修改决定图像透明度的 alpha (a) 通道。图像被加载到一个数组中,这样更容易读取和修改像素值。此代码仅修改 (0,0) 处的像素,但您可以将其放入循环中以修改图像边框上的像素。

编辑 - 这应该有效 -

for y in range(img.height):
    for x in range(img.width):
        if any([x<32,x>img.width-32,y<32,y>img.height-32]):
            lo[x,y]=(lo[x,y][0],lo[x,y][1],lo[x,y][2],127)

输入-

输出-

创建需要保留 100% 不透明度的图像副本。将不透明度放在主图像上,最后将复制的图像粘贴到原始图像上。边框不透明度完成。

from PIL import Image

padding = 32
opacity = 127
img = Image.open("image.png").convert('RGBA')

x, y, w, h = padding, padding, img.width - padding, img.height - padding
img_cropped = img.crop((x, y, w, h))

img.putalpha(127)

img.paste(img_cropped, (x, y))
img.save('image_new.png')

因为你想要在所有图像中使用相同的 alpha/transparency 通道,所以我倾向于先在循环之外制作一次,然后简单地将它推入每个图像。

from PIL import Image, ImageOps

# Make a single alpha channel in advance = 512x512 black and 448x448 white square in middle
border = 32
alpha = Image.new('L', (512-2*border,512-2*border), "white")
alpha = ImageOps.expand(alpha, border)
alpha.save('DEBUG-alpha.png')

然后您的代码变得非常简单:

dem_fps = ["1.png", "2.png", "3.png"]

# Open each image in turn and push in our ready-made alpha channel
for item in dem_fps:
   im = Image.open(item).convert('RGB')
   im.putalpha(alpha)
   im.save(f'RESULT-{item}')
 

Alpha 通道 (DEBUG-alpha.png) 如下所示:

当然,您也可以通过制作一个 512x512 的黑色正方形并在中间绘制一个白色矩形来构建 alpha 通道,如果这在概念上对您来说更容易的话。