图像枕头的透明边框
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 通道,如果这在概念上对您来说更容易的话。
我有一个 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 通道,如果这在概念上对您来说更容易的话。