- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 CGContextSetBlendMode 实现 html5 canvas globalCompositeOperation 并将 html5 canvas 运算符(source-in、source-atop 等)转换为其 CGBlendMode 对应项(kCGBlendModeSourceIn、kCGBlendModeSourceAtop 等)。
以下是根据规范的预期结果:
使用 CGContextSetBlendMode,我得到了这个:
有些结果是错误的。例如,源输出(Quartz 2D 中的 kCGBlendModeSourceOut)不会裁剪蓝色矩形。
哪个实现是正确的,我不确定。但我的问题是,有解决方法吗?经过一番修改,我想出了这个解决方案,在应用操作之前对目标进行预处理:
这是执行此操作的预处理步骤(假设源路径已设置):
auto save = CGContextCopyPath(ctx);
CGContextSaveGState(ctx);
CGContextAddRect(ctx, CGRectInfinite);
CGContextEOClip(ctx);
CGContextSetBlendMode(ctx, kCGBlendModeClear);
CGContextAddRect(ctx, CGRectInfinite);
CGContextFillPath(ctx);
CGContextRestoreGState(ctx);
CGContextAddPath(ctx, save);
CGPathRelease(save);
通过解决方法,我几乎得到了我想要的:
除了源输出中的伪像以及圆圈轮廓中的一些(抗锯齿?)边缘。
还有更好的办法吗?我做错了吗?我错过了什么吗?
提前非常感谢您,请原谅这个冗长的问题。
最佳答案
混合模式是由一个函数实现的,该函数基本上接受两种颜色(每种颜色都来自一个源)作为输入,并为您提供结果颜色作为输出。
f(a,b) = c
在您的示例中,我们可以假设蓝色矩形来自一个源a
,红色圆圈来自另一个源b
。我不熟悉 Quartz 2D,但如果它有一个 API 可以直接访问每个像素的颜色,那么您可以遍历两个源的像素,调用每个像素的混合函数并获得结果图像。
c[1][1] = f(a[1][1], b[1][1])
c[1][2] = f(a[1][2], b[1][2])
...
c[n][m] = f(a[n][m], b[n][m])
其中 n
和 m
- 分别以像素为单位的图像宽度和高度。
请注意,遍历像素可能是一项昂贵的操作,尤其是在处理高分辨率图像时。
关于source-out
- 它是Porter/Duff合成运算符之一,有点类似于混合模式。除了两种颜色之外,它还需要这些颜色的 Alpha channel 值。 Alpha 值表示每个源应在最终结果中表示多少,并且根据您要使用的运算符,使用或丢弃此“参与”值。
function sourceOut(aColor, bColor, aAlpha, bAlpha) {
return bAlpha * (1 - aAlpha) * bColor;
}
引用:
关于cocoa - Quartz 2D 实现 html5 canvas globalCompositeOperation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60785036/
在使用 ng-lottie 时用于动画。它突然出现构建问题。 Know more . 因此,为了寻找替代品,我正在尝试 ng-particles . 我已经安装了它并按照文档添加了配置。 但是,现在我
我有一个简单的代码,我想为播放器创建蒙版。 ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.drawImage(level1, 0, 0);
我在 html5 Canvas 的 javascript 中使用 globalCompositeOperation 时遇到问题。 https://jsfiddle.net/6j51kxeh/ 我使用“
我有一个大的源图像,我想在一个圆圈内显示它的一小部分,并使圆圈外的 Canvas 部分保持透明。 Mozilla guide to Compositing with HTML5涵盖两个主题:globa
如何使用此函数在红色和绿色框之间放置一个蓝色框? 我需要实现这个效果。 这是一个 Codepen . HTML JS var canvas = document.getElementById("c
我有一个 Canvas ,其中包含透明背景上的艺术。我像这样降低饱和度: boardCtx.fillStyle = "rgba(0, 0, 0, 1.0)"; boardCtx.globalCompo
我正在尝试创建径向进度 View 。 Canvas 中的第二条弧应该只清除 Canvas 的一小部分,但它却将其全部清除。 我用过: this.ctx.globalCompositeOperation
我如何将 globalCompositeOperation(或任何其他可以给我“multiply”颜色操作的插件)集成到 jCanvas 中jQuery 插件? // How do I get thi
我正在尝试编写 Sierpinski 地毯前几次迭代的简单演示,如下所示: 我想要继续的方法是通过单击以在每一步上以较小的比例应用基本图案蒙版。在我看来,通过从一个黑色方 block 开始,然后使用“
我有这 4 个层。 我想做的是将 red 和 blue 层放入一个 mask 中。但我不希望 purple 或 orange 层受到此掩码的影响(只有 red 和 blue).我设法让它适用于 ora
我正在努力思考 globalCompositeOperation通过尝试组合这两个示例来获得属性:JSFiddle和 Codepen . 前者使用destination-out,后者使用source-
我对 globalCompositeOperation 有疑问。 我的目标是让蓝色元素仅显示在红色元素内部,并且根本不应该在红色矩形外部可见(有点溢出隐藏效果)。另外,红色和蓝色都必须具有转换能力(都
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我正在尝试使用globalCompositeOperation在 内的对象上元素,但我的目标是与 Canvas 外部的对象混合 - 一个简单的 html 标记元素,如段落。 我的最终目标是使用 di
如何使用 globalCompositeOperation 删除某些内容? http://canvaspaint.org/有一个橡皮擦,但那只是一条白线 - 只有当你的背景是白色的时候才行......
我正在尝试使用 Canvas 的 globalCompositeOperation='destination-in' 设置来绘制一系列被径向渐变掩盖的点。我想要的结果显示在下面的屏幕截图中: 相反,我
每年年底我都会制作一个烟花表演 Canvas 效果(Javascript),最后一个是: http://js1k.com/2011-dysentery/demo/955 这个效果很简单:用create
我在这里查看所有不同类型的全局复合操作: https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globa
我知道 ctx.globalcompositeoperation=source-over 在使用 drawimage 时有效,但它可以与 putimagedata 一起使用吗? 最佳答案 简短的回答是
有没有一种方法可以“更轻量”地使用 globalCompositeOperation,同时使用 source-atop? (又名打火机,但仅限于已经绘制了一些东西的地方。) 最佳答案 一次只能设置一项
我是一名优秀的程序员,十分优秀!