- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想按照 W3C compositing and blending spec 中的描述实现颜色混合. (我正在用 JavaScript 执行此操作,但语言对于解决我的问题应该无关紧要。)
回想起来:在回答这个问题的过程中,我意识到这可能会成为一个非常好的独立包。如果您有兴趣,可以 grab it from npm .
到目前为止效果还不错,但我想更进一步地使用这些算法并添加对 alpha channel 的支持。感谢SVG compositing spec提供并不太难的所有需要的公式。
但现在我坚持实现 W3C 规范描述为 non-separable 的混合模式它们是(从 Photoshop 中得知):色调、饱和度、颜色 和亮度。
遗憾的是,这些算法在 SVG 规范中不可用,我不知道如何使用这些算法。我想有 the formulas provided by the W3C 的修改版本用于处理我所缺少的 alpha channel 。
为了让我的问题更直观一些,我将展示 Photoshop 为 hue 混合两种颜色提供的功能:
这也是我能够使用上述 W3C 规范中的非 alpha 算法重现的结果。
我无法重现的是当我在源颜色和背景颜色上都设置较低的 alpha 时 Photoshop 给我的结果:
有谁知道如何以编程方式实现该结果?
更新 1:更改了插图(添加 HSVA 和 RGBA 代码)以阐明使用的颜色。
更新 2:为了检查可能的解决方案,我将附上另外两个 Photoshop 生成的混合示例:
更新 3: 所以事实证明,除了对颜色混合一无所知之外,我还 messed up my Photoshop settings ,使解决我的问题的任务更加困难。修复了 future 可能的路人的示例图像。
最佳答案
第二张图片中的 Hue alpha 不代表 alpha 颜色合成公式,但它反射(reflect)了 Porter Duff alpha composition Source Over 定义为此处 9.1.4. Source Over它使用以下公式:
如果你想实现那种混合,这不是正确的 Hue 混合,你可以在 javascript 中使用以下公式:
PDso = { // Ported Duff Source Over
r: ((S.r * S.a) + (B.r * B.a) * (1 - S.a)) / aR,
g: ((S.g * S.a) + (B.g * B.a) * (1 - S.a)) / aR,
b: ((S.b * S.a) + (B.b * B.a) * (1 - S.a)) / aR,
};
// where
// S : the source rgba
// B : the backdrop rgba
// aR : the union alpha (as + ab * (1 - as))
带 Alpha channel 的色调混合模式
这是使用我在 Photoshop 中创建的 alpha 颜色合成公式在背景上精确混合源的屏幕截图:
带有绿色突出显示字母的中间方 block 是正确的混合表示。这是使用新 CSS mix-blend-mode
将 CSS Hue mix 与背景颜色中的源颜色混合。 (运行代码片段):
.blends div {
width:140px;
height:140px;
}
.source {
mix-blend-mode: hue;
}
.backdrop.alpha {
background-color: rgba(141, 214, 214, .6);
isolation: isolate;
}
.source.alpha {
background-color: rgba(255, 213, 0, .6);
}
<div id="main">
<div class="blends alpha">
<div class="backdrop alpha">
<div class="source alpha"></div>
</div>
</div>
</div>
如果您使用颜色选择器,您将获得几乎相同的值 ( 211, 214, 140 <> 210, 214, 140
)。这可能是由于略有不同的算法或不同的舍入方法,但这并不重要。事实上,当使用色调混合模式混合 alpha 颜色时,这是正确的结果。
因此,现在我们需要公式为应用于我们的色调混合模式的 alpha 颜色合成提供正确的颜色值。我搜索了一下,在 Adobe Document management - Portable document format - Part 1: PDF 1.7 中找到了所有内容.我们可以在 Blend Modes 之后的 328 页面找到颜色合成公式:
11.3.6 Interpretation of Alpha
The colour compositing formula
这是我设法为带 alpha channel 的色相混合模式获得正确且更接近 Photoshop 匹配的公式。我在 javascript 中是这样写的:
function Union(ab, as) {
return as + ab * (1 - as);
}
function colourCompositingFormula(as, ab, ar, Cs, Cb, Bbs) {
return (1 - (as / ar)) * Cb + (as / ar) * Math.floor((1 - ab) * Cs + ab * Bbs);
}
var aR = Union(B.a, S.a); // αr = Union(αb, αs) // Adobe PDF Format Part 1 - page 331
var Ca = {
// Adobe PDF Format Part 1 - page 328
r: colourCompositingFormula(S.a, B.a, aR, S.r, B.r, C.r),
g: colourCompositingFormula(S.a, B.a, aR, S.g, B.g, C.g),
b: colourCompositingFormula(S.a, B.a, aR, S.b, B.b, C.b)
};
// where
// C : the hue blend mode result rgb
// S : the source rgba
// B : the backdrop rgba
// aR : the union alpha (as + ab * (1 - as))
// Ca : the final result
body {
padding:0;
margin:0;
}
iframe {
width: 100%;
height: 200px;
border:0;
padding:0;
margin:0;
}
<iframe src="https://zikro.gr/dbg/html/blending-modes/"></iframe>
可以找到我的测试例子here .在 2.5 With Alpha(Hue Blending Algorithm Computed),您可以看到带有 alpha 的最终色调混合模式结果。它的值与 Photoshop 结果略有不同,但我在 Fireworks 中得到了完全相同的结果 ( 202, 205, 118
),色调混合了源颜色和背景颜色:
所有应用程序都有自己的略有不同的算法,也许我使用的公式很旧,也许有最新版本。
关于algorithm - 使用 "hue"混合模式混合两种非不透明颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40796852/
我知道您不应该将打印与 printf,cout 和 wprintf,wcout 混合使用,但是很难找到一个好的答案,为什么以及是否可以绕过它。问题是我使用了一个用 printf 打印的外部库,而我自己
我有以下问题: class A: animal = 'gerbil' def __init__(self): self.result = self.calculate_
我在屏幕上渲染了一堆形状(多边形),我没有使用深度测试。 我只是希望这些形状在绘制在空白区域时使用自己的颜色,并且在绘制到任何非空区域时使用红色像素,即在我的情况下绘制在另一个多边形上。 这里的问题实
我正在尝试在我的 Groovy/Grails 应用程序中混入一个类,我正在使用 the syntax defined in the docs ,但我不断收到错误消息。 我有一个如下所示的域类: cla
我已经找到了 5349574673 个关于 Alpha 混合的页面,但我仍然无法获得想要的结果。我正在尝试使用 opengl 使 gif/png 文件正确显示(具有透明度/半透明度)。 这是我的初始化
我正在尝试记录以下代码,但我似乎无法让 JSDoc 记录该类,甚至无法引用它的存在。 // SomeMixin.js export default superclass => class SomeMi
我有一个类型家族,我想使用 mixin 以模块化方式“丰富”它们。例如: trait Family { self => trait Dog { def dogname:String
我在 Storyboard中有 Collection View 。我在 Storyboard中有一部分单元格,还有我以编程方式创建的部分单元格。我应该在 sizeForItemAtIndexPath
我有一个字节数组,我想更改它的访问方式。这是数组: char bytes[100]; 我想要另一个数组来改变原始数组的访问方式。如果我们可以将引用放在数组中,它看起来像这样: char& bytes_
我需要从 c 文件调用 cpp 方法。我为此编写了这个界面.. cpp文件 extern "C" void C_Test(int p){ Class::CPP_Test(p); } c文件
我的网站有两份 CSS 表,一份是主 CSS,一份是移动 CSS。问题是在移动设备(iPhone、Android)上查看时,两个样式表会混淆。例如,在 iPhone 上查看网站时,会应用主样式表中的某
维护人员的说明:此问题涉及已过时的 bokeh.charts API,该 API 已于多年前删除。有关使用现代 Bokeh 创建各种条形图的信息,请参阅: https://docs.bokeh.org
在下图中,蓝色圆圈仅用于调试目的。我的目标是蓝色圆圈后面的每一层都应该是透明的。我只想保持蓝色圆圈外面的可见。 这是用 swift 编写的代码: let croissantView = UIV
我不是 SQL 专家。我正在使用 SQL Server 2005,我正在尝试弄清楚如何构造一个查询,以便它可以满足多种要求。我有两个表定义如下: Classroom - ID - Departme
原创: 我之前问过这个问题,但我最初的例子有点不完整,我想我现在可以更具体地说明我的问题。 对于上下文,我在旧的 Apple mac 计算机上使用 openGL 3.3 并尝试渲染四边形的重叠层。每个
是否可以将内联(类似 json)映射与同一对象的常规映射定义混合使用? 考虑以下示例: person: {age: 32, weight: 82} name: foo 生成的人应具有给定的年龄、体
假设我有一个 Parent 类,它有四个字段 A、B、C 和 D,这样 C 和 D 可以选择传递或使用默认实现进行初始化: open class Parent(val a: A, val b: B,
我正在使用 symphony (1.4) 框架在 PHP 中开发一个 Web 应用程序。该代码使用 SVN 进行版本控制。在此网络应用程序中,我们所有客户共享一个共同的基础,以及一些专门为每个客户创建
我想使用两个小部件(一次一个)作为我的应用程序的基础/背景,上面有一个 QML UI 和一个无边框窗口。它应该看起来像这样: 基于 OpenGL 的扫描组件 通过窗口句柄操作的 3D 可视化组件 多个
我们有一个混合的 AngularJS/Angular 8 应用程序,并且我们不断遇到来自不同版本框架的组件之间的变化检测非常慢的问题。到目前为止,我们只在 Angular 组件中使用 AngularJ
我是一名优秀的程序员,十分优秀!