将 PNG 转换为预乘 alpha 的方法

发布于 2024-11-18 10:14:39 字数 1539 浏览 4 评论 0原文

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

猫瑾少女 2024-11-25 10:14:39

根据要求使用 ImageMagick:

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

感谢@mf511 的更新。

Using ImageMagick, as requested:

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

Thanks @mf511 for the update.

浸婚纱 2024-11-25 10:14:39

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

等等瞧!

A more complete version of the cssndrx answer, using slicing in numpy to improve speed:

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 voila !

我的奇迹 2024-11-25 10:14:39

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

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

I just released a bit of code in Python and in C that does what you are looking for. It's on github: http://github.com/maxme/PNG-Alpha-Premultiplier

The Python version is based on the cssndrx response. C version is based on libpng.

穿透光 2024-11-25 10:14:39

通过 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)

It should be possible to do this through PIL. Here is a rough outline of the steps:

1) Load the image and convert to numpy array

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

2) Modify the matrix in place. The matrix is a list of lists of the pixels within each row. Pixels are represented as [r, g, b, a]. Write your own function to convert each [r, g, b, a] pixel to the [r, g, b] value you desire.

3) Convert the matrix back to an image using

    new_im = Image.fromarray(matrix)
夜光 2024-11-25 10:14:39

仅使用 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)

Using PIL only:

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)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文