PIL/Pillow透明度反转似乎任意发生

4 投票
1 回答
1150 浏览
提问于 2025-04-18 08:54

我安装了Pillow 2.4.0(在OS X的虚拟环境和Ubuntu 14.04的EC2上都有)。我写了一个脚本来生成波形的可视化效果(灵感来自Jiaaro)。这个脚本使用Pydub库来分析波形,并用PIL/Pillow中的ImageDraw功能来绘制线条。wav变量是一个音频片段(来自Pydub库),imgname是一个字符串:

def draw_waveform(wav, imgname, color="#000000", w=400, h=40):
    sound = wav
    name = imgname
    width = w
    height = h
    color = color

    chunk_length = len(sound) / width

    loudness_of_chunks = [
        sound[ i*chunk_length : (i+1)*chunk_length ].rms
        for i in range(width)]

    max_rms = max(loudness_of_chunks)
    scale = max_rms/(height/2)

    size = (width,height)
    im = Image.new('RGBA', size, (255, 255, 255, 255))

    draw = ImageDraw.Draw(im)

    for i in range(1, width):
        pos = (width - i, height/2 + loudness_of_chunks[i]/scale-4)
        draw.line((width - i,height/2) + pos, fill=color)
        pos = (width - i, height/2 - loudness_of_chunks[i]/scale+4)
        draw.line((width - i,height/2) + pos, fill=color)

    del draw

    im.rotate(180).save(app.config['UPLOAD_FOLDER'] + '/' + name, 'GIF', transparency=0) #, transparency=0

    return app.config['UPLOAD_FOLDER'] + '/' + name

大部分时间一切都很顺利。不过在某些波形上,特别是那些接近峰值的波形,PIL会输出一个透明度反转的GIF——波形部分是透明的,而周围的空间是白色的。正常情况下,背景是透明的,波形是黑色的(#000000)。

这是预期输出的图片:

正确的输出

而这是错误的输出(右键保存并在图像编辑器中打开,因为它的背景是白色的,中间是透明的):

错误的输出

有没有人遇到过类似的问题?我是不是漏掉了什么明显的东西(很可能)?

1 个回答

3

结果发现,这比我想象的要简单多了(真是意外)。感谢@MarkRansom给我的灵感。

用'P'来创建图像,而不是'RGBA',

im = Image.new('P', size, 255)

定义你的颜色(黑色用0表示)

color=0

确保保存的时候,把白色区域设置为透明,而不是黑色:

im.save(name, 'GIF', transparency=255)

我还是有点好奇,为什么原来的代码有时候会失败……

撰写回答