Python 保存GIF'时透明度不一致;他在比尔

Python 保存GIF'时透明度不一致;他在比尔,python,python-imaging-library,transparency,gif,Python,Python Imaging Library,Transparency,Gif,我正在编写一个脚本,它可以覆盖图像并使背景透明。输出应该是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'

我正在编写一个脚本,它可以覆盖图像并使背景透明。输出应该是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()
图像1.png

图像2.png

字体在这里

以及有问题的输出。

输出工作正常。

问题在于,您的“原始图像”包含的索引颜色与GIF用于表示“此像素是透明的”的索引颜色相同

GIF是“基于调色板的”-该调色板中的一个索引被指定为“这是透明的”(见f.e.)

因此,如果您指定
纯黑色
纯白色
作为透明的颜色索引,并且您的源图像已经包含具有此确切颜色的像素,那么它们也将是透明的

为了避免这种情况,您可以对源背景图像进行采样,并选择一种“不存在”的颜色作为透明度颜色-这永远不会出现在生成的图像中


您还可以更改源图像的像素值-检查所有像素并更改所有“背景像素”少了一点,这样它们就不会变得半透明。

@BipulJain这篇文章用PIL替换像素-我在PIL方面做得不多-只是碰巧对图形格式有点了解。你建议把所有白色的值都改为透明吗?那会很贵的。此外,我将螺丝内的文本区域像素以及。您的采样想法和使用“不存在”作为透明度值正好合适。@BipulJain不确定您的性能问题-您必须将背景的所有255255像素更改为254254(或smth),这在查看图像时不会对结果图像造成太大影响。或者,在图像的所有像素中搜索一种“未使用”的颜色,并将其用作背景-您需要评估的可能性更大。也许一些PIL用户会插话进来,就让这个答案保持原样吧,希望有人能提出一些代码,这将是我的建议。使用PIL可能会有更好的解决方案。也许有粘贴选项