如何通过 javascript 以 canvas 类似 ffmpeg 风格绘制马赛克?
How to draw mosaic by javascript in a canvas like ffmpeg style?
视频的马赛克是由ffmpeg添加的,但我需要在canvas中用javascrip绘制它。
我试过 BoxBlur 和 GaussBlur,它们都不像 ffmpeg 那样工作,
有人知道红色循环中样式的算法或只是模糊样式的名称吗?
感谢您的关注
这是一种简单的框模糊形式。您可以在 canvas 中使用 drawImage()
的内置 resampling/interpolation 通过绘制两次,首先使用单个垂直列并按宽度绘制,然后在顶部使用半 alpha混合,一行并垂直绘制。
使用给定 image 的修改版本的示例(但扩大了,下面示例代码中的源区域扩大了 10 倍以匹配视觉效果)。
需要注意的一点是,在这种情况下,垂直样本从下到上;您可能需要考虑到这一点,因为 drawImage()
将从上到下绘制。您可以使用转换来处理此问题(scale(1,-1)
+ 适当的偏移量)。
var ctx, img = new Image; img.onload = blur; img.src = "//i.stack.imgur.com/NbSH2.png";
function blur() {
c.width = this.width; c.height = this.height;
ctx = c.getContext("2d");
ctx.drawImage(this, 0, 0);
// use alpha here as well on top of original (not present in given image).
// pass 1: horizontal Source column (10x) Target area
ctx.drawImage(this, 50, 0, 10, 210, 50, 0, c.width - 50, 210);
// pass 2: vertical
ctx.globalAlpha = 0.5;
ctx.drawImage(this, 50, 210, c.width - 50, 10, 50, 0, c.width - 50, 210);
}
<canvas id=c></canvas>
视频的马赛克是由ffmpeg添加的,但我需要在canvas中用javascrip绘制它。
我试过 BoxBlur 和 GaussBlur,它们都不像 ffmpeg 那样工作, 有人知道红色循环中样式的算法或只是模糊样式的名称吗? 感谢您的关注
这是一种简单的框模糊形式。您可以在 canvas 中使用 drawImage()
的内置 resampling/interpolation 通过绘制两次,首先使用单个垂直列并按宽度绘制,然后在顶部使用半 alpha混合,一行并垂直绘制。
使用给定 image 的修改版本的示例(但扩大了,下面示例代码中的源区域扩大了 10 倍以匹配视觉效果)。
需要注意的一点是,在这种情况下,垂直样本从下到上;您可能需要考虑到这一点,因为 drawImage()
将从上到下绘制。您可以使用转换来处理此问题(scale(1,-1)
+ 适当的偏移量)。
var ctx, img = new Image; img.onload = blur; img.src = "//i.stack.imgur.com/NbSH2.png";
function blur() {
c.width = this.width; c.height = this.height;
ctx = c.getContext("2d");
ctx.drawImage(this, 0, 0);
// use alpha here as well on top of original (not present in given image).
// pass 1: horizontal Source column (10x) Target area
ctx.drawImage(this, 50, 0, 10, 210, 50, 0, c.width - 50, 210);
// pass 2: vertical
ctx.globalAlpha = 0.5;
ctx.drawImage(this, 50, 210, c.width - 50, 10, 50, 0, c.width - 50, 210);
}
<canvas id=c></canvas>