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

4

我已经安装了Pillow 2.4.0(在OS X虚拟环境和Ubuntu 14.04 EC2上)。我编写了以下脚本以生成波形可视化图形(从Jiaaro获取灵感)。它使用Pydub库分析波形,并使用PIL/Pillow的ImageDraw函数绘制线条。wav变量是一个audiosegment()(来自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)。
以下是预期输出的图片:

Correct output

我能为您提供帮助,以下是需要翻译的内容:

而不正确的(右键另存为并在图像编辑器中打开,因为其背景是白色的,中间是透明的):

Incorrect output

有人遇到类似的问题吗?我是否漏掉了一些显而易见的东西(很可能是)?


1
尝试使用图像格式'P'代替'RGBA',并在save上设置透明索引。请参阅http://pillow.readthedocs.org/en/latest/handbook/image-file-formats.html#gif - Mark Ransom
简单的技巧:您可以创建一个完全黑色的图层,并将当前输出覆盖在其上。但这并不能解决您真正的问题,我不知道答案 ;) - Jiaaro
@Jiaaro - 不幸的是,我需要表格中显示它们的透明度。顺便说一下,非常感谢您出色的库(如果您添加24位支持,我将送给您许多礼物;)) - lyell
@MarkRansom - 我尝试了那个方法和几个变化。我通过设置color=255并使用im = Image.new('P', size, 0)来实例化图像,成功得到了一个带有透明背景的白色图像。不幸的是,反过来却没有产生预期的结果,而是与之前相同的错误渲染。 - lyell
1个回答

3

原来这比我想象的要简单(出乎意料)。感谢@MarkRansom在这里的启发。

实例化图像时使用“P”而不是“RGBA”,

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

定义你的颜色(对于黑色,为0)

color=0

确保保存操作将白色区域定义为透明而不是黑色:

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

我还有一点好奇,为什么原始代码有时候只会失败...

但它的解释需要进一步的调查和分析才能确定根本原因。


终于看到你的回答了,虽然是在你写下它的两年半之后。它只有有时候失败的原因是调色板是自适应的,基于图像颜色从头构建。哪种颜色最终会出现在索引0几乎是完全随机的。 - Mark Ransom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接