问题标签 [compositing]

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 投票
1 回答
89 浏览

opengl - 重构复杂的 opengl 混合

我正在尝试重现相当复杂的混合操作的效果(已更正)。

srcdest参考源缓冲区和目标缓冲区中各自的 rgba 组件。我想做的是把它变成一个混合链,使用glBlendFunc和/或可以被调用以产生与上述表达式相同的结果,也许通过在每次调用glBlendFuncSeparate后多次渲染相同的场景。glBlend*虽然很遗憾我无法将复杂的混合作为单个调用进行,但在我看来,通过使用不同的参数glBlend*多次渲染我的场景,我仍然可以达到我想要的效果。glBlend*我在想我可能需要 3 次这样的电话,但可以分两次进行。

编辑:

要了解 blend 函数的作用,请首先考虑常规 alpha blend src * src_alpha + dest * (1 - src_alpha)。这种混合风格适用于几乎所有源不包含预乘 Alpha 的 Alpha 混合,特别是当我们渲染到最终设备(例如屏幕或其他设备)时,目标明确为或可能假定为不透明。

如果目标已经是不透明的,那么这个复杂的混合函数将产生与前面提到的普通混合函数相同的结果,而目标是不透明的,而如果目标恰好是完全透明的,那么复杂的混合函数会降级为源副本而是继承源的透明度。因此,复杂混合函数实际上所做的只是根据目标 alpha 在这两个极端值之间进行线性插值。

编辑:需要更正上面的混合功能......我错误地考虑了它。我在下面显示推导以进行验证:

首先,我从一个基本的混合功能开始:

而我想要做的是将它与 src 混合具体取决于 dest_alpha,因此上述函数乘以 dest_alpha,然后我将其添加到源乘以 1 - dest_alpha,如下所示:

算术重构给了我这个:

0 投票
0 回答
271 浏览

colors - GIMP 的图层合成/混合方法

在我寻求在 Matlab 中为我的图像混合工具添加 alpha 容量时,我遇到了一些障碍。其中,我一直使用这些 链接作为我的参考,以了解前景和背景 alpha 如何影响输出颜色数据和输出 alpha 的组合。

我最初的方法是简单地将 aa Src-Over合成用于“正常”混合模式,将Src-Atop合成用于其他模式。与 GIMP 的输出相比,这产生了相似但不同的结果。输出 alpha 匹配,但 RGB 数据不同。

具体来说,在背景 alpha 为零的情况下,前景对背景的颜色影响为零。在花了几个小时天真地浏览 GIMP 2.8.10 源代码后,我注意到一些让我感到困惑的事情。

除非在导出期间发生的某些模式和一些我尚未在代码中收集到的辅助事情,否则该方法大致如下:

好奇的地方在于,我从概念上不理解为什么要使用最少的图层 alpha 进行合成。当然,这种方法会产生与 GIMP 匹配的结果,但如果我不理解其中的原因,我会觉得将其设置为默认行为会让人感到不舒服。


这可能最好在某个地方的 GIMP 论坛上提出,但我认为接触普通观众会更有成效。澄清和总结:

  • 透明 BG 区域中的颜色不受与不透明前景色相乘的影响是否有意义?这种风险不会导致硬掩模边缘附近未更改的数据在未来的某些操作中溢出吗?
  • 虽然我没有找到任何东西,但还有其他使用这种方法的应用程序吗?
  • 使用 GIMP 的行为作为参考我错了吗?我没有 PS 可以比较,而且 ImageMagick 非常灵活,它并没有真正暗示特定的预期行为。当然,GIMP 有些事情做错了。也许这是其他可能会改变的事情。

编辑:我至少可以通过避免它来回答最后一个问题。我决定添加对 SVG 1.2 和旧版 GIMP 方法的支持。GIMP 将来使用的 GEGL 方法遵循 SVG 方法,因此我认为这表明了遗留方法的适当性。

值得一提的是,SVG 方法都基于 Porter-Duff Src-Over组合。如果参考文档,混合数学相同的事实会被混淆,因为混合和合成是使用预乘 alpha 进行代数组合以降低总体计算成本。除了 SoftLight,核心混合数学与 GIMP 和其他地方使用的相同。

只需执行以下操作即可使任何其他混合操作(例如 PinLight、Hue)兼容:

如果你想简化它,然后做一些代数。

0 投票
1 回答
1198 浏览

gstreamer - Gstreamer用三个流合成图像

我正在尝试使用 gstreamer 的 videomixer 插件合成三个流。我发现这个线程将多个图像与 gstreamer 结合起来,我可以设法将两个流并排放置,但我不知道如何添加第三个。任何人都可以帮忙吗?

我使用和工作的原始命令:

我的带有两个 udp 流的版本也可以:

但是如何添加第三个流?

0 投票
1 回答
304 浏览

matlab - Matlab:带有灰度蒙版的 Alpha 合成

我正在尝试在 Matlab 中模拟 alpha 合成的功能,或者更具体地说是 ImageMagick 中的 CopyOpacity 和 Over 合成类型。第一个目标是屏蔽具有重锯齿边缘的区域,例如集合中图像中的黑色区域(具有锯齿边缘的图像集)。这应该使用兼容的灰度蒙版来完成,黑色区域应该被消除,白色应该被保留,参见灰度蒙版。重要的是黑白之间的连续过渡导致透明和不透明之间的连续过渡,请参见 带有透明区域的屏幕截图)

有两种方法可以用灰度掩码 CM_mask_blur_alpha 组合前景 FG 和背景 BF,但结果不如预期(参见使用 ImageMagick进行后处理的图像集作为纯 Matlab 程序的参考)。

1)在第一个代码中,灰度掩码意外地被视为二进制掩码,导致以前黑色区域的边缘出现不可接受的混叠效果(第一种方法的图像集):

2)第二种方法导致前景和背景之间可见的连续过渡,但剩余的FG存在混叠效果(第二种方法的图像集):

似乎一步法不起作用,所以我正在寻找像 ImageMagick 中那样的两步法,它屏蔽掉黑色区域,从而产生具有透明度的中间图像,作为第二步,合成这个中间图像在一个背景。这部分是 MATLAB 中的问题设置:在 RGB 图像上应用透明蒙版并与另一个图像混合,但没有灰度蒙版,我无法调整解决方案部分,例如使用从灰度蒙版派生的值生成 alpha 通道。

0 投票
1 回答
1069 浏览

video - ffmpeg - 在中心的视频中合成视频

我正在寻找使用 ffmpeg 合成视频,无论合成视频的纵横比/大小如何,都将视频置于中心。

“背景”视频将始终为 16:9 和 1920x1080 像素。我不知道覆盖视频的纵横比或大小,因为它将由用户上传,并且可以是任何大小/比例。

这是我要实现的目标的示例:

这是背景图片:

在此处输入图像描述

现在我想在顶部覆盖一个视频:

在此处输入图像描述

这也应该有效:在此处输入图像描述

基本上无论尺寸如何,我都想确保它始终调整大小以适应 1920x1080 并确保它始终居中。

最后,如果上传的视频也是 16:9,它应该简单地覆盖整个视频: 在此处输入图像描述

0 投票
1 回答
1266 浏览

opengl - 如何使用 OpenGL 在 SDL 中获得正确的 SourceOver alpha 合成

我正在使用具有 alpha 通道 (32bpp ARGB) 的 FBO(或“渲染纹理”)并使用不完全不透明的颜色清除它,例如(R=1、G=0、B=0、A= 0)(即完全透明)。然后我正在渲染一个半透明的对象,例如一个带有颜色(R=1,G=1,B=1,A=0.5)的矩形,在此之上。(所有值从 0 标准化到 1)

根据常识,还有 GIMP 和 Photoshop 等成像软件,以及 Porter-Duff 合成的几篇文章,我希望得到的纹理是

  • 矩形外完全透明
  • 白色 (1.0, 1.0, 1.0),矩形内不透明度为 50%。

像这样(你不会在 SO 网站上看到这个):

使用 gimp 创建的预期结果

相反,背景颜色 RGB 值,即 (1.0, 0.0, 0.0) 总体上使用 (1 - SourceAlpha) 而不是 (DestAlpha * (1 - SourceAlpha)) 加权。实际结果是这样的:

实际结果

我已经直接使用 OpenGL、使用 SDL 的包装器 API 和 SFML 的包装器 API 验证了这种行为。使用 SDL 和 SFML,我还将结果保存为图像(带有 alpha 通道),而不是仅仅渲染到屏幕上,以确保最终渲染步骤没有问题。

我需要做什么来产生预期的 SourceOver 结果,无论是使用 SDL、SFML 还是直接使用 OpenGL?

一些资料来源:

W3 关于合成的文章,指定 co = αs x Cs + αb x Cb x (1 – αs),如果 αb 为 0,则 Cb 的权重应为 0,无论如何。

英语 Wiki显示目的地(“B”)根据 αb(以及 αs,间接地)加权。

German Wiki显示了 50% 透明度的示例,透明背景的原始 RGB 值显然不会干扰绿色或洋红色源,还表明交叉点明显不对称,有利于“顶部”元素。

乍一看,还有几个关于 SO 的问题似乎处理了这个问题,但我找不到任何与这个特定问题相关的内容。人们建议使用不同的 OpenGL 混合函数,但普遍的共识似乎是glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA),这是 SDL 和 SFML 默认使用的。我也尝试过不同的组合,但没有成功。

另一个建议是将颜色与目标 alpha 预乘,因为 OpenGL 只能有 1 个因子,但正确的 SourceOver 需要 2 个因子。但是,我完全无法理解这一点。如果我将 (1, 0, 0) 与目标 alpha 值(例如 (0.1))进行预乘,我会得到 (0.1, 0, 0)(例如这里建议的)。现在我可以告诉OpenGL这个因素GL_ONE_MINUS_SRC_ALPHA(和源GL_SRC_ALPHA),但后来我有效地与黑色混合,这是不正确的。虽然我不是该主题的专家,但我付出了相当多的努力来试图理解(并且至少达到了我设法编写每个合成模式的工作纯软件实现的地步)。我的理解是,将 0.1 的 alpha 值“通过预乘”应用于 (1.0, 0.0, 0.0) 与将 alpha 值正确地视为第四个颜色分量完全不同。

这是一个使用 SDL 的最小且完整的示例。需要 SDL2 本身来编译,如果要另存为 PNG,则可以选择 SDL2_image。

0 投票
4 回答
467 浏览

javascript - 使用 CSS 混合两个带有 alpha 边框的 .png 图像

有没有一种方法可以混合两个 PNG 图像以在它们都有带 alpha 的边框时完美匹配?

这是我遇到的问题的一个示例:

或CodePen的链接

情况是我有两个保存为 PNG 的 3D 渲染,并且都具有 50% 透明度的 alpha 边框,如果您在 Photoshop 和/或 After Effects 中合并它们,它们将完美匹配。

但是当在 HTML/CSS 中创建相同的情况时,我们在元素之间有一条白线。在阅读了一些关于混合混合模式背景混合模式并用它们进行一些测试之后,它似乎没有帮助。我们认为这两个图像(它们的 alpha 通道)都与背景预乘,这就是为什么你会在它们之间得到半透明线(边界所在的位置)。

有没有办法用 CSS 甚至 JavaScript/jQuery 来实现这一点?

编辑:所以我们不会对图像移动和css技巧进行更多评论。删除该 1px 或隐藏它不是一个选项,因为大图片不会具有相同的外观。

0 投票
1 回答
1023 浏览

python - Foundry Nuke 的 Reformat 节点问题

作为我的核弹项目的一部分,我想跟踪我的镜头并将 CG 元素添加到其中。为此,我对素材进行了不失真处理并将其写入磁盘以加快处理速度。然而,当我试图重新扭曲书面素材(如附图所示)时,它并没有给我原始素材。我发现Reformat5andReformat7并没有给我相同的边界框尺寸,即使两个节点是相同的。

在此处输入图像描述

我的原始素材大小是 1920*1080。不失真后变成1928*1085。

因此,我放置了一个Reformat4尺寸为 1928*1085 的节点并将其写入磁盘。在左侧,我再次放置重新格式化节点,将未失真的素材调整回 1920*1080,并保留大小为 1928*1085 的边界框,以便执行镜头失真以恢复我的原始素材。

它在左侧工作正常,但如果我在我的书面素材上做同样的事情,边界框尺寸就不一样了。

Reformat7给出大小为 1924*1083 而不是 1928*1085 的边界框。我在这里想念什么?我在网上搜索,但找不到任何解决方案。请对这个问题有所了解。

我的核弹脚本如下:

0 投票
0 回答
186 浏览

ios - CIAdditionCompositing 与 componentAdd 有何不同?

Core Image 提供了两种添加两个图像的方法: CIAdditionCompositingcomponentAdd。我可以使用其中任何一个来总结两个图像中的像素值。除了后者仅在 iOS 11 上受支持之外,它们是否不同?

例如,一个在线性空间中进行加法,而另一个在伽马空间中?

0 投票
2 回答
1375 浏览

java - 仅使用 API 将灰度图像绘制到另一个 BufferedImage 的 alpha 带

我有两个 BufferedImage:一个是 TYPE_INT_ARGB,另一个是 TYPE_BYTE_GRAY。如何仅使用 API 将整个彩色图像的 alpha 波段替换为灰度图像,而不干扰 RGB 值?

我可以通过屏蔽和复制这样的字节来手动完成:

但是 API 方式是什么?

更新 #1 示例图像:输入灰度 alpha、输入彩色猫和输出带孔的彩色猫。 甜甜圈的灰度彩色猫合并结果

生成的图像在输出颜色的 alpha 中具有灰度。在照片编辑器中查看生成的图像,您会看到中间的孔实际上是透明的。

重申我最初的目标,Java API 的方式是什么来完成上述代码的工作?