问题标签 [porter-duff]

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 回答
1623 浏览

c# - C# 中的快速逐像素混合效果“相乘”(适用于 android)

我一直在寻找一种更快的方法来在我的位图上使用混合效果“相乘”。我试过使用PorterDuff.Multiply,但在包含 Alpha 通道的位图上没有达到预期的效果,任何 0 alpha 的东西都会变成黑色。

我已经阅读过,似乎我可以实现我所追求的效果的唯一方法(photoshop/gimp 的“乘法”图层混合)是通过应用每个像素的效果。

OpenGL 不是应用程序的选项。

我不确定我是否正确理解维基百科建议的混合模式的算法。

TopColour * BottomColour / 255

将会:

转换Color.ToArgb和使用整数会更快吗?最后,我是否正确计算了乘法效果 - 它没有正确显示:(

我被卡住了,任何帮助将不胜感激。

谢谢你。

0 投票
1 回答
2767 浏览

android - 在android中实现不同的PorterDuff模式

我正在开发一个图片编辑工具,我需要在其中合并两个图像。大多数图像编辑工具(如 gimp)都使用PorterDuff 模式来合并或混合图像。我也在android中使用相同的方法。
由于 android 提供有限数量的 PorterDuff 模式,我无法达到预期的结果。所以,我正在考虑实现 android 中不包含的 PorterDuff 模式(重叠、强光、柔光、颜色燃烧、颜色减淡)。
问题是我不知道从哪里开始。因此,在这方面的任何参考或指导都将受到高度赞赏。

0 投票
1 回答
1705 浏览

android - 不能使用paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); 在安卓中

我正在我的图像中制作反射效果,但我不能使用这条线

有一条红线是“DST_IN”,表示它无法解析或不是字段。除了我,还有谁可以使用它?是否有任何插件等可以使用该行?我试图搜索它,但我找不到任何使用它的方法。

任何想法将不胜感激。

0 投票
1 回答
10955 浏览

android - 在 View 上启用 HW 加速的矩形叠加层中打孔

我有一个视图可以做一些基本的绘图。在此之后,我想绘制一个带有打孔的矩形,这样只有前一个绘图的一个区域是可见的。我想通过为我的视图启用硬件加速来实现这一点,以获得最佳性能。

目前我有两种可行的方法,但仅在禁用硬件加速且另一种太慢时才有效。

方法 1:SW 加速(慢速)

这不适用于为视图启用的硬件加速,因为此模式不支持“canvas.clipPath”(我知道我可以强制 SW 渲染,但我想避免这种情况)。

方法 2:硬件加速(V. 慢速)

橡皮擦的创建位置

这显然很慢——Bitmap每次绘图调用都会创建一个新的视图大小。

方法3:硬件加速(速度快,在某些设备上不起作用)

与硬件加速兼容方法相同,但不需要额外的画布。但这有一个主要问题——它可以强制使用 SW 渲染,但在 HTC One X(Android 4.0.4——可能还有其他一些设备)上,至少启用了 HW 渲染,它会使圆圈完全变黑。这可能与22361有关。

方法四:硬件加速(可接受,适用于所有设备)

根据 Jan 提出的改进方法 2 的建议,我避免在每次调用时创建位图onDraw,而是在onSizeChanged

然后只是在onDraw

性能不如方法3,但比方法2好很多,略好于方法1。

问题

如何以与硬件加速兼容的方式实现相同的效果(并且在设备上始终如一地工作)?增加 SW 渲染性能的方法也是可以接受的。

注意:当移动圆圈时,我只是在使一个区域无效——而不是整个画布——所以那里没有性能改进的空间。

0 投票
1 回答
6225 浏览

java - PorterDuffXfermode DST_IN 未按预期工作

所以我试图加快我们正在做的一些绘图(绘制具有 alpha 透明度的弧的一部分),并试图将整个弧缓存到一个单独的位图中,并使用 alpha 蒙版选择性地显示它。

根据我所做的研究(Android 的 Xfermodes API 演示、此示例此工具),如果我有以下两个图形:

在此处输入图像描述

在此处输入图像描述

并使用以下内容进行绘制:

我应该得到这个结果:

在此处输入图像描述

目标图像(圆圈)被剪裁到源图像(弧)绘制的区域。相反,我得到了完整的圆圈。如果我只是画圆弧,它会出现在正确的位置,如果我使用 DST_OUT 代替,我会得到预期结果的倒数(圆的其他三个象限)。

我还确保禁用此视图的硬件渲染,以防此 Xfermode 出现问题,但这并没有什么不同。

我以最简单的方式将它分解为一个单独的项目,试图让它工作,并使用以下代码,我仍然遇到同样的问题:

我用错了吗?我只是错过了什么吗?我发现了一个错误吗?:)

0 投票
2 回答
2450 浏览

android - Android - 如何防止带有 Porterduff.Mode.Screen 的 ColorFilter 混合 alpha?

我在我的 GridView 中加载了一些图像,我想使用混合屏幕模式为它们应用微红色。

在我的适配器中,我有以下代码:

我也试过

但我总是以这样的方式结束: Alpha 通道为红色

如果我使用Mode.Multiply,它不会为透明背景着色,但结果太暗了。是否可以使用Mode.Screen而不着色透明部分?

我必须创建一个ColorMatrix吗?有人能指出我正确的方向吗?

0 投票
1 回答
1277 浏览

android - Android - 将位图纹理应用于 API 绘图例程

我有一个跨越整个屏幕的位图,它将用作我需要绘制到画布上的 Path 对象的纹理。然后我有一个背景图像,这个纹理路径需要在上面绘制。

我尝试使用 PorterDuff 模式,但似乎没有任何工作正常。我很难弄清楚 PorterDuff 模式的确切运作方式,因为它们似乎都没有按照我一直认为的方式运作

我已经找到了一种使用此测试代码纹理路径的方法:

但我不知道如何将其放置在背景图像之上。我只是错误地使用了 PorterDuff 模式吗?

0 投票
1 回答
2037 浏览

android - Ninepatch Drawable 与 ColorFilter

我正在创建一些日历视图,我想做的是为可点击的 LineairLayout 创建一个背景。

因此,我创建了一个包含两个图像的 StateListDrawable:

  1. 背景图像
  2. 按下项目时的图像

到目前为止,这适用于这段代码:

但我想做一些额外的事情。我希望用户能够传递他想要用来显示背景的颜色。所以背景var必须是可变的,但必须是基于九个补丁的drawable。

所以我想我可以做这样的事情:

其中 Color.RED 必须替换为用户选择的颜色。

但这似乎不起作用。九个补丁创建完美,但没有应用颜色过滤器。

我还尝试了其他 PoterDuff.Mode 的:

  • SRC
  • SRC_ATOP
  • DST_IN
  • ...

如果您有任何线索我做错了什么或者我可以做些什么来解决我的问题,请告诉我!:-)

氪,

短剑

0 投票
1 回答
671 浏览

android - 是否可以在层列表中定义 XferMode?

如果有办法在图层列表 XML 文件中指定多个图层并告诉每个图层根据 PorterDuff 的特定 XferMode 进行混合,我一直在徘徊。
生成复合背景将非常有用。

0 投票
0 回答
426 浏览

android - Android中图像之间的交叉淡入淡出

我目前正在开发一个 Android 应用程序。我主要使用 drawBitmap 方法在 Canvas 对象上进行所有绘图。我正在尝试实现的当前效果是在两个位图之间“交叉淡入淡出”。这两个位图是相似的图像,只有外部不同。通过交叉淡入淡出,相同的内部部分应保持不变,而外部区域似乎从一种状态淡入到另一种状态。我查看了每个可用的 PorterDuff.Modes,但没有一个符合我想要的确切效果。基本上我认为我想要实现的等式是:

w = 权重(从 0 到 1) a_i, c_i = 图像 i = 1 和 2 的 alpha 和颜色值

(a1, c1) +(w) (a2, c2) = ((1-w)*a1 + w*a2, ((1-w)*a1*c1 + w*a2*c2) / ((1- w)*a1 + w*a2))

(当然,也考虑到零除法 - 这基本上是两个图像的加权“平均”)

有什么办法可以编写“自定义” PorterDuff 模式来实现这一点?如果有更有效的方法来实现这一点,我不想必须提取每个位图的颜色数组并在每一帧手动循环它们来进行这种转换。

如果有人知道一种有效地解决这个问题的方法,或者知道另一种我不知道并且无法在网上找到的方法,那将不胜感激。此外,如果我的转变似乎不适合这项任务,也欢迎您提出批评。

PS 我试图只插入 alpha 值并按原样绘制两个图像,但是例如在插值的中间,在通常为 1 的区域中,两者的 alpha 值都是 0.5,并且绘制两个 0.5 alpha 图像会导致透明度,这不是我想要的。正常的 ADD 操作最终会使颜色饱和,这也是不希望的。