问题标签 [premultiplied-alpha]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
5801 浏览

opengl - 在 OpenGL 中绘制纹理,同时忽略其 Alpha 通道

我有一个纹理加载到内存中,它是具有各种 alpha 值的 RGBA 格式。

图像加载如下:

我想知道如何绘制此纹理,以便将图像中的 alpha 通道视为全 1,并且将纹理绘制为 RGB 图像。

考虑基本图像:

http://www.ldeo.columbia.edu/~jcoplan/alpha/base.png

此图像是从 0 到 255 alpha 的渐变,并且整个 RGB 值为 255,0,0

但是,如果我在禁用混合的情况下绘制它,我会得到一个看起来像这样的图像:www.ldeo.columbia.edu/~jcoplan/alpha/no_alpha.png

当我真正想要的是一个看起来像这样的图像时:www.ldeo.columbia.edu/~jcoplan/alpha/correct.png

我真的很感激一些建议让它完全忽略 alpha 通道。请注意,我最初不能将图像作为 RGB 加载,因为我在其他点确实需要 alpha 通道。

编辑:我尝试使用 GL_COMBINE 来解决我的问题:

但仍然没有运气,它仍然将黑色绘制为红色。

0 投票
4 回答
2254 浏览

graphics - 如何在手动“叠加”混合操作中处理 alpha?

我正在玩一些手动(步行像素)图像处理,并且我正在重新创建标准的“叠加”混合。我在这里查看“Photoshop 数学”宏:

http://www.nathanm.com/photoshop-blending-math/ _ _ _

两个源图像都采用相当标准的 RGBA(每个 8 位)格式,目标图像也是如此。当两个图像完全不透明(alpha 为 1.0)时,结果将按预期正确混合:

但是,如果我的“混合”图层(顶部图像)具有透明度,那么对于如何将 alpha正确地考虑到混合方程中,我会感到有些困惑。我希望它能够工作,这样混合层中的透明像素对结果没有影响,混合层中的不透明像素正常进行覆盖混合,半透明混合层像素对结果有一些缩放效果。

有人可以向我解释混合方程或这样做背后的概念吗?

如果你能帮我做到这一点,那么得到的图像具有正确的预乘 alpha 值(我认为,这只对两层中不透明的像素起作用。)

谢谢!

0 投票
3 回答
3466 浏览

image-processing - 如何在图像卷积期间使用预乘来解决 alpha bleed 问题?

我正在尝试将框模糊应用于透明图像,并且边缘周围出现“暗晕”。

Jerry Huxtable简短地提到了这个问题,并且一个很好的演示显示了问题的发生:

在此处输入图像描述

但是,对于我的生活,我无法理解“预乘 alpha ”如何解决问题。现在举一个非常简单的例子。我有一个 3x3 图像,包含一个红色和一个绿色像素:

在此处输入图像描述

实际上剩余的像素是透明的:

在此处输入图像描述

现在我们将对图像应用 3x3 框模糊。为简单起见,我们将只计算中心像素的新值。盒子模糊的工作方式是,因为我们有一个 9 位置的正方形(3x3,称为内核),我们取内核中每个像素的 1/9,并将其相加:

在此处输入图像描述

所以

在这个非常简化的示例中,计算变得非常简单:

这给了我一个最终的颜色值:

在此处输入图像描述

这个颜色太深了。当我在 Photoshop 中对相同的 3x3 像素图像执行 3px 框模糊时,我得到了我所期望的:

在此处输入图像描述

在白色上显示时更清晰:

在此处输入图像描述


实际上,我在包含透明文本的位图上执行框模糊,并且文本在边缘周围变得暗淡:

在此处输入图像描述

我从PixelFormat32bppARGB格式的 GDI+ 位图开始


应用 3x3 卷积核时如何使用“预乘 alpha”?

任何答案都必须包括新的论坛,因为:

给我错误的答案。


编辑:一个更简单的例子是:

我将使用 0..1 范围内的颜色和 alpha 值执行此数学运算:

在此处输入图像描述

我将框模糊卷积过滤器应用于中间像素:

这给出了相当透明的深绿色。

在此处输入图像描述

这不是我期望看到的。相比之下,Photoshop 的 Box Blur 是:

在此处输入图像描述

如果我假设(0, 0.33, 0, 0.33)是预乘 alpha,并且不乘它,我得到:

在此处输入图像描述

这看起来适合我的全不透明示例;但是当我开始涉及部分透明的像素时,我不知道该怎么办。

也可以看看

0 投票
5 回答
6972 浏览

png - 将 PNG 转换为预乘 alpha 的方法

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

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

谢谢!

0 投票
1 回答
355 浏览

video - FLV 预乘 Alpha 通道 - 作为 swf 添加到网页?

我对预乘 Alpha 通道非常陌生,我唯一的应用程序是 Adob​​e Flash,我有这个 FLV 电影文件,它有一个预乘 Alpha 通道,我想将它插入网页以作为动画播放,我将其导入闪光,这就是我有点迷茫的地方,不知道如何让它看起来透明

视频看起来是倒置的,所以背景是黑色的,动画是白色的,所以如果我尝试像这样发布它,它只是保持不变,所以看起来不正确,有人能指出我正确的方向吗?

0 投票
1 回答
1631 浏览

image-processing - 将 PNG 从预乘 alpha 转换为传统的 alpha 透明度?

我很难处理一些具有预乘 alpha 的 PNG 格式的源图像,因为大多数工具根本无法正确支持它。

有什么东西可以“最佳猜测”转换为更传统的 PNG 吗?

0 投票
1 回答
443 浏览

php - php中的imagecopyresampled - 预乘alpha问题

对于使用 alpha 值的缓冲区,我对 imagecopyresampled 有疑问。显然,该算法在过滤之前预乘了像素的 alpha 值,这会导致对象周围出现黑色边框。

重现步骤:

  • 拍摄一张在 RGB 部分完全是白色的图像,并且在 Alpha 部分的黑色背景上有一个(抗锯齿!!)白色圆圈(用一个圆圈,而不是一个正方形!)白色和全黑像素,以及由于抗锯齿在圆的边界上的一些渐变像素 - 这意味着输入图像没有预乘 - 它是直的/无遮罩的,因为图像的 RGB 部分是完全白色的)。

  • 使用 imagecopyresampled 将图像缩小一半

  • 在全白图像上合成结果

我所期望的:完全白色的图像

我得到了什么:圆圈轮廓周围的灰色边框

我很确定这是由于缩小算法中的预乘 alpha(该算法将像素 alpha 值与其 rgb 值相乘以计算新的 rgb 值 - 因此白色像素将变为灰色)

有谁知道这个的workarround?

0 投票
0 回答
387 浏览

alphablending - 预乘 alpha 的粒子混合问题

我试图从 3D 渲染场景中保存一些纹理,然后让它们重用。
最大的问题是rgb值不能匹配它的alpha值。我需要一些没有黑边的图片,所以我必须使用rgb颜色来划分它的alpha值(Photoshop等图像处理软件只能处理alpha通道未预乘的图片.)
不幸的是,颜色太浅以至于某些结果值被截断为 1。
所以我转向了一种称为预乘 alpha 的技术。(查看更多)。我没有使用着色器,而是使用单独的 alpha 计算。
例如:
RenderState.SourceBlend = Blend.SourceAlpha;
RenderState.DestinationBlend = Blend.InverseSourceAlpha;
现在我添加一些渲染状态。
RenderState.SourceBlendAlpha = Blend.One;
RenderState.DestinationBlendAlpha = Blend.InverseSourceAlpha;
它运作良好。但是当我尝试处理以下事情时:
RenderState.SourceBlend = Blend.SourceAlpha;
RenderState.DestinationBlend = Blend.One;
RenderState.SourceBlendAlpha = Blend.One;
RenderState.DestinationBlendAlpha = Blend.One;
结果完全错误,有人可以告诉我原因吗?
PS:现在我明白了。当我使用非预乘混合状态,即SourceAlpha和inverseSourceAlpha。rgba值肯定控制在0~1之间。但是当我切换到加法状态,即SourceAlpha和1时,rgb值可能超过一个,从而导致不正确的值。
现在我的问题是如何控制 alpha 值,以确保它保留所有细节并且不会同时溢出?

0 投票
1 回答
1134 浏览

opengl-es-2.0 - OpenGL 和相机预览 - 预乘 alpha - 混合在一起得到“过度饱和”的颜色

好的,这是我真的无法解决的 OpenGL 问题。在 Galaxy S1 和 S2 上一切正常,似乎有几乎相同的 GPU。但是当我尝试制作一个 AR 应用程序时,我总是在我的相机预览顶部遇到透明像素的问题。它仅在像素透明并且看起来像“烧焦的颜色”或值溢出或类似的东西时才会出现。所以请告诉我我做错了什么,或者如果你有 S3 试试看。也许我的刚刚坏了??我为你创建了一个小测试程序。请看一下:

CameraView 看起来像这样:

游戏渲染器:

还有一个小的 MatrixStack 类,但我认为这里不会有问题:

好吧,仅此而已。看起来相机预览“过度曝光”了我的 gl 片段。请至少尝试此代码。我仍然希望我的手机有问题。无论如何,谢谢你的帮助,托拜厄斯

0 投票
1 回答
454 浏览

opengl - GLSL 粒子的渲染(premult)

我一直在尝试让粒子渲染库与我的着色器一起使用。它与固定功能完美结合,我知道我的目标是什么。我只是不确定如何进行最后的混合。

它将这样的粒子生命打包到 DWORD 中,并将 dword 设置为顶点属性之一。一个四边形有 4 个这样的顶点。3 个浮动位置,3 个浮动正常,4 个字节漫反射,2 个浮动 uv。我应该如何处理 4byte 属性,在我的 glsl 着色器中将其用作 vec4 还是 float 属性?另外,由于这个库使用预乘 alpha,我应该使用什么样的混合方程?该库是 pyro 粒子库。