9

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

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

谢谢!

4

5 回答 5

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())

瞧!

于 2011-07-30T09:02:34.633 回答
13

根据要求使用 ImageMagick:

convert in.png -write mpr:image -background black -alpha Remove mpr:image -compose Copy_Opacity -composite out.png

感谢@mf511 的更新。

于 2014-11-27T19:39:03.883 回答
2

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

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

于 2011-07-15T21:27:08.387 回答
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)
于 2011-07-07T04:25:17.747 回答
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)
于 2015-07-14T08:03:17.857 回答