javascript - HTML5 Canvas 图像上的嵌入阴影

标签 javascript css html canvas

我以前见过这个问题,但给出的答案是针对通过路径绘制的 Canvas 图像的,但是,我正在绘制图像。

是否可以创建一个inset-shadow

context.shadowOffsetX = 0;
context.shadowOffsetY = 0;
context.shadowBlur = 10;
context.shadowColor = 'rgba(30,30,30, 0.4)';

var imgOne = new Image();
imgOne.onload = function() {
    context.drawImage(imgOne, 0, 0);
};
imgOne.src = "./public/circle.png";

于是我画上圆圈图。我现在在圆圈外面有一个轻微的阴影,我怎样才能得到这个 inset 而不是 offset

最佳答案

合成链

使用一系列的合成+绘制操作来获得嵌入阴影。

注意:该解决方案在创建时需要对 Canvas 元素的独占访问权,因此要么在屏幕外的 Canvas 上执行此操作并绘制回主画面,要么如果可能,计划在生成后绘制辅助图形。

所需步骤:

  • 绘制原图
  • 使用 xor 组合反转 alpha channel 填充 Canvas
  • 定义阴影并将其自身拉回
  • 停用阴影并绘制原始图像(destination-atop)

Result

var ctx = c.getContext("2d"), img = new Image;
img.onload = function() {

  // draw in image to main canvas
  ctx.drawImage(this, 0, 0);

  // invert alpha channel
  ctx.globalCompositeOperation = "xor";
  ctx.fillRect(0, 0, c.width, c.height);

  // draw itself again using drop-shadow filter
  ctx.shadowBlur = 7*2;  // use double of what is in CSS filter (Chrome x4)
  ctx.shadowOffsetX = ctx.shadowOffsetY = 5;
  ctx.shadowColor = "#000";
  ctx.drawImage(c, 0, 0);

  // draw original image with background mixed on top
  ctx.globalCompositeOperation = "destination-atop";
  ctx.shadowColor = "transparent";                  // remove shadow !
  ctx.drawImage(this, 0, 0);
}
img.src = "http://i.imgur.com/Qrfga2b.png";
<canvas id=c height=300></canvas>

关于javascript - HTML5 Canvas 图像上的嵌入阴影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37378088/

相关文章:

css - MdSidenavLayout 内的粘性 MdToolbar

html - 避免滤镜模糊导致关闭的 DIV 元素模糊

html - 带方括号的编码 URL。 Chrome/Firefox/IE 中的不同行为

html - 创建一个仅在小屏幕尺寸下显示的子列

javascript - 单击按钮即可删除/添加类

javascript - 如何使用 Greasemonkey 脚本通过 XSLT 转换 XML 文件?

javascript - NodeJS 两个 "Require"参数

javascript - 调整 flexbox 中图像的大小在 Chrome 中渲染不正确

html - 更改下拉菜单的大小

javascript - Chrome CSS 高度属性与 Firefox 不同?