问题标签 [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 投票
1 回答
1098 浏览

java - TYPE_INT_ARGB_PRE 的影响

我一直在使用 ConvolveOp 时遇到一些问题,可以通过将我正在使用的BufferedImage的imageType设置为TYPE_INT_ARGB_PRE来解决这些问题(请参见此处的相关 SO 答案)。

不幸的是,我并不完全理解选择这种不同的 imageType 的所有含义,而且我似乎也找不到好的参考,所以让我在这里尝试一下:

将 BufferedImage 的 imageType 从 TYPE_INT_ARGB 更改为 TYPE_INT_ARGB_PRE 会影响哪些绘图操作?它只是BufferedImageOps吗?或者它是否会影响图像的Graphics对象上的任何绘制命令,或者如果将图像绘制到不同的 Graphics 对象上,它会影响图像的渲染方式?

0 投票
3 回答
836 浏览

imagemagick - 使用 ImageMagick 合成预乘图像

我有两张图片。一种是没有 alpha 的背景。另一个是白云。云图像的 alpha 与黑色预乘。当我合成它们时,白云中有黑色,所以它看起来是灰色的,而不是应该的白色。我正在做:

有没有办法在 ImageMagick 中合成预乘图像,或者图像必须是非预乘的?我可以使用 ImageMagick 制作非预乘的预乘图像吗?

更新:
好的,以下是 TGA 格式的图片供下载:

http://acatysmoof.com/posting/problems/imagemagick/premultiplication/bg.tga http://acatysmoof.com/posting/problems/imagemagick/premultiplication/whitecloud.tga http://acatysmoof.com/posting/problems/ imagemagick/premultiplication/aftereffects.tga http://acatysmoof.com/posting/problems/imagemagick/premultiplication/imagemagick.tga

并以与 jpgs 相同的顺序在浏览器中查看:

bg.jpg 白云.jpg 后效.jpg imagemagick.jpg

我尝试了提供的所有模式,但没有一个能产生与 After Effects 相同的结果。

0 投票
1 回答
926 浏览

opengl - opengl中图像部分透明部分周围的暗晕

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)我经常用OpenGL发现,当我尝试在纹理上绘制一些东西,然后在另一个表面上绘制时,使用靠近其边缘的图像。这显然是由于制作本质上是由这种混合风格引起的预乘 alpha 的问题引起的。对于 3d 场景,我通常使用画家算法,而对于渲染 2d 内容,我喜欢先绘制最后面的对象,然后在它们上面叠加其他对象。值得注意的是,在进行这样的 2d 绘图时,我通常不能像在 3d 中那样依赖像 az buffer 这样的功能,这就是为什么渲染 guis 之类的东西比渲染 3d 场景图更成问题

我认为值得注意的是,当目标缓冲区恰好已经完全不透明时,上述混合风格实际上是完美的,但如果目标是透明的,那么在这种情况下真正需要的是glBlendFunc(GL_SRC,GL_ZERO)......因为任何全白像素例如,在源中部分透明的应该保持与颜色一样完全饱和,而不是与实际不存在的背景“混合”,因为使用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)实际上会渲染一个部分透明和全白的像素前景和背景之间的混合,这是我想要的,但不会丢失 alpha 信息,也不会导致颜色实际改变。

因此,在我看来,一种可能是完美的混合功能实际上是混合了由其他原因引起的glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)内容和由其他原因引起的内容,glBlendFunc(GL_SRC,GL_ZERO)这取决于DST_ALPHA自身的价值。

因此,理想情况下:

这样,如果目标已经不透明,则正常的 alpha 乘法会适当地混合,而如果目标是透明的或部分透明的,它将使用更多源图像的真实颜色,而不是使用所述颜色的 alpha 预乘形式。

然而,似乎没有明显的方式来向 OpenGL 描述这种混合机制。似乎这些问题不应该是我的情况所独有的,而且在我看来,似乎没有任何方法可以实现这一点……即使在可编程管道中也是如此。

到目前为止,我发现的唯一解决方法是每当我绘制到稍后将在其他地方绘制的纹理时反转绘制顺序,并使用glBlendFuncSeparate(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA, GL_SRC_ALPHA, GL_DST_ALPHA).

在我在纹理上绘制一些稍后将正常渲染的东西的情况下,为绘制顺序制作一个特殊情况是一种折衷方案,但这对我来说没有吸引力,因为它缺乏可重用性,除非总是让正在绘制的代码知道目的地的类型是什么,以便它可以颠倒自己通常的绘图顺序,我可以不必要地使它复杂化。

最后,虽然颠倒整个场景的绘制顺序不一定完全不可能,但它需要在绘制第一个对象之前确定将在每一帧图形中显示的对象的完整列表。我遇到的核心问题是,尽管在渲染 3D 场景时这可能是可持续的,但在绘制 2d gui 之类的东西时,绘制的东西种类繁多,绘制方式如此之多,以至于没有将它们概括为单个对象列表的方法,以后总是可以以相反的顺序遍历该对象列表。在我看来,对于如何在这种“倒退”中构建 2d 场景,它需要一种截然不同的观点

那么......还有其他方法可以做到这一点吗?我错过了什么吗?还是我必须学习一种完全不同的方式来构建二维图像?我不能是唯一遇到这个问题的人,但我还没有找到任何好的和干净的解决方案。

编辑:

如果确实存在由 NVIDIA 或其他方式对 OpenGL 的任何常用扩展,则允许使用可以执行此操作的混合模式:

(其中 Cs 和 Cd 是源颜色和目标颜色,As 和 Ad 是源和目标 alpha 值,Cr 和 Ar 是结果颜色和 alpha 值),我真的很想知道扩展名是什么,以及如何使用它……只要它可以在消费硬件上生产。

0 投票
1 回答
880 浏览

android - OpenGL ES 2.0 Alpha

我正在尝试加载纹理 PNG(由 photoshop 导出)并在 Android 的 OpenGL ES 2.0 中使用它,但纯色似乎是透明的(png 中的黑色圆圈是全黑的)

错误 PNG

我听说如果您将 png 缩放超过 50%,则会出现该错误(我测试了更多相同的缩放,所以我认为情况并非如此)

我还读到 BitmapFactory 不读取预乘 alpha PNG,我尝试了另一个认为可以工作但没有工作的功能(也许是错误的)

有什么方法可以实现正确的 alpha?

这是我的片段着色器:

这是我的抽奖电话:

这是我的加载功能;

0 投票
1 回答
292 浏览

webgl - webgl中颜色和alpha的数学公式

现在我正在查看生成的画布的颜色:

rvba = 222,8,33,255

公式是什么?(final_R,final_V,final_B,final_A) = 函数 (bg_R,bg_V,bg_B,bg_A,ccR,ccV,ccB,ccA) ?

此外,如果 premultipliedAlpha 设置为 false,此函数如何更改?

谢谢 !

编辑:哎呀...我在屏幕截图中读取了画布的结果颜色...但是值每次都在变化,现在我有 rvba = 227,0,20,255

好的..截图是一个非常奇怪的想法......现在我使用 gl.readpixel,我得到了:[204, 0, 0, 128]

所以,有了这个非常不同的结果,我的问题已经过时了。

对不起 !

0 投票
1 回答
565 浏览

python - PIL - 防止预乘 Alpha 通道

我正在尝试在图像上添加 alpha 通道,但结果不是预期的:

这是给定的结果:

结果

预期结果:

预期结果

是否可以防止预乘?我还尝试拆分波段并将它们与新的 Alpha 通道合并,但结果相同。

0 投票
1 回答
92 浏览

c# - 如何使.NET 以 PARGB32 格式保存 TIFF?

我创建了一个 PARGB32 格式的位图。我意识到 PNG 不能存储预乘 alpha(至少,标记为这样),但我相信 TIFF 可以。如何强制 .NET 以 PARGB32 格式保存 TIFF?默认情况下,即使保存的位图是 PARGB32 格式,它也会以 AGRB32 格式重新加载。

0 投票
0 回答
332 浏览

android - 在 Bitmap.compress 上禁用预乘 alpha

我正在从我的 Android 应用程序中保存图像,即使使用 alpha 通道(BitmapFormat 是)myBitmaps.compress(Bitmap.CompressFormat.PNG, 100, stream),它也能很好地工作。ARGB_8888然后我想将图像读回应用程序,并删除 alpha 通道,恢复一个完全不透明的版本。

这适用于像素足够不透明的任何地方。但是:如果一个像素几乎是透明的,就会出现奇怪的伪影:我猜它与这个“预乘 alpha”有关,但不知道如何改变它。关于如何防止这些伪影的任何想法?

0 投票
2 回答
623 浏览

performance - 为什么使用预乘 alpha 没有“显着更差的性能”?

QPainter负责Qt中的绘图和合成。文档中有一个部分讨论了性能。我的问题是关于下一段中的粗体句子。

Raster - 这个后端在纯软件中实现所有渲染,并且总是用于渲染到 QImages 中。为获得最佳性能,仅使用格式类型 QImage::Format_ARGB32_Premultiplied、QImage::Format_RGB32 或 QImage::Format_RGB16。任何其他格式,包括 QImage::Format_ARGB32,性能明显较差。该引擎默认用于 QWidget 和 QPixmap。

我知道将颜色通道乘以 alpha 是在源操作中完成的。这种乘法可以提前完成,以避免在合成器中进行。执行此乘法涉及将 RGB 通道乘以 alpha,然后除以 255(或乘以某个以正确方式溢出以模仿除法的幻数)。这是每像素六个整数乘法。当然执行额外的六个整数乘法不会有“明显更差的性能”?

阿尔法乘法真的那么慢吗?也许他们只是说他们不会像其他人那样尝试优化该代码路径,因此不能保证它的执行方式?

0 投票
1 回答
1232 浏览

swift - 将 CGImage 转换为 MTLTexture 而不进行预乘

我有一个 UIImage 我之前从 png 文件创建的:

我想将 strokeImage (具有不透明度)转换为MTLTexture用于在 中显示的MTKView,但进行转换似乎会执行不需要的预乘,这会使所有半透明边缘变暗。

我的混合设置如下:

我尝试了两种转换方法:

以及更精细的 dataProvider 驱动的方法:

两者都会产生相同的不需要的预乘结果。

我尝试了后者,因为有一些帖子表明旧的 swift3 方法CGDataProviderCopyData()从未预乘的图像中提取原始像素数据。可悲的是,相当于:

似乎没有奏效。我错过了什么吗?

任何指针将不胜感激。