将PNG转换为预乘alpha的方法

时间:2011-07-06 03:50:41

标签: png imagemagick python-imaging-library premultiplied-alpha

Windows 寻找某种简单的工具或流程,让我将一个或多个标准PNG转换为预乘alpha。

命令行工具是理想的;我可以轻松访问PIL(Python Imaging Library)和Imagemagick,但如果能让生活更轻松,还会安装其他工具。

谢谢!

5 个答案:

答案 0 :(得分:13)

更完整版的cssndrx答案,使用numpy中的切片来提高速度:

import Image
import numpy

im = Image.open('myimage.png').convert('RGBA')
a = numpy.fromstring(im.tostring(), dtype=numpy.uint8)
alphaLayer = a[3::4] / 255.0
a[::4]  *= alphaLayer
a[1::4] *= alphaLayer
a[2::4] *= alphaLayer

im = Image.fromstring("RGBA", im.size, a.tostring())

Et瞧!

答案 1 :(得分:12)

按要求使用ImageMagick:

convert in.png -background black -alpha Remove in.png -compose Copy_Opacity -composite out.png

感谢@ mf511进行更新。

答案 2 :(得分:2)

我刚刚在Python和C中发布了一些代码,可以满足您的需求。它在github上:http://github.com/maxme/PNG-Alpha-Premultiplier

Python版本基于cssndrx响应。 C版基于libpng。

答案 3 :(得分:1)

应该可以通过PIL来做到这一点。以下是步骤的大致概述:

1)加载图像并转换为numpy数组

    im = Image.open('myimage.png').convert('RGBA')
    matrix = numpy.array(im)

2)修改矩阵。矩阵是每行内像素列表的列表。像素表示为[r,g,b,a]。编写自己的函数将每个[r,g,b,a]像素转换为您想要的[r,g,b]值。

3)使用

将矩阵转换回图像
    new_im = Image.fromarray(matrix)

答案 4 :(得分:0)

仅使用PIL:

def premultiplyAlpha(img):
    # fake transparent image to blend with
    transparent = Image.new("RGBA", img.size, (0, 0, 0, 0))
    # blend with transparent image using own alpha
    return Image.composite(img, transparent, img)