我正在编写覆盖图像并使背景透明的脚本。输出应该是GIF格式。
该脚本可以工作,但是对于某些图像,透明度不能按预期工作。
这是脚本
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
CANVAS_HEIGHT = 354
CANVAS_WIDTH = 344
def get_text_mask():
font_style_path = 'Ultra-Regular.ttf'
text_mask_base = Image.new('L', (CANVAS_WIDTH, CANVAS_HEIGHT), 255)
text_mask = text_mask_base.copy()
text_mask_draw = ImageDraw.Draw(text_mask)
font = ImageFont.truetype(font_style_path, 94)
text_mask_width, text_mask_height = text_mask_draw.multiline_textsize("1000\nUsers",
font=font)
text_mask_draw.multiline_text(((CANVAS_WIDTH - text_mask_width) / 2,
(CANVAS_HEIGHT - text_mask_height) / 2),
"1000\nUsers",
font=font,
fill=0,
align='center')
return text_mask
def run():
images = ['image1.png', 'image2.png']
for index, original_image in enumerate(images):
image = Image.open(original_image)
blank_canvas = Image.new('RGBA', (CANVAS_WIDTH, CANVAS_HEIGHT), (255, 255, 255, 0))
text_mask = get_text_mask()
final_canvas = blank_canvas.copy()
for i in xrange(0, CANVAS_WIDTH, image.width):
for j in xrange(0, CANVAS_HEIGHT, image.height):
final_canvas.paste(image, (i, j))
final_canvas.paste(text_mask, mask=text_mask)
final_canvas.convert('P', palette=Image.ADAPTIVE)
final_canvas.save("output-{}.gif".format(index), format="GIF", transparency=0)
run()
答案 0 :(得分:1)
问题是您的“原始图像”包含的索引颜色与GIF用来表示“此像素是透明的”相同。
Gif是“基于调色板的”-该调色板中的一个索引被指定为“此索引是透明的”(请参见f {e。https://en.wikipedia.org/wiki/GIF)
因此,如果您将pure black
或pure white
指定为透明的颜色索引,并且源图像已经包含具有这种精确颜色的像素,则它们也将变得透明。
为避免这种情况,您可以对源背景图像进行采样,然后选择“不存在”的颜色作为透明度颜色-这样就永远不会出现在结果图像中。
您还可以更改源图像的像素值-检查所有像素并更改所有“背景像素”一小部分,以免它们变得不透明。