【发布时间】:2023-03-25 01:10:02
【问题描述】:
我正在为视频文件编写“电视滤镜”(你知道那种,RGB 条放大),我一直在研究一些缩小图像的方法,以保留尽可能多的细节尽可能。
为了进行测试,我将采样图像绘制回屏幕以查看质量 - 在实际过滤器中,我将仅采样像素并获取所得计算颜色的 RGB 值。
我试过三个,Hermite滤镜看起来不错,但与速度“硬件”最近邻版本相比,它不适合处理视频。
JavaScript 中是否有任何“技巧”可用于加速图像缩小,如 2,但质量如 1 或 3?
1:蛮力:http://codepen.io/SarahC/pen/VpvWvb?editors=1010
2:内部最近邻:http://codepen.io/SarahC/pen/ryeQgN?editors=1010
3:Hermite 过滤器:http://codepen.io/SarahC/pen/ryMNWZ?editors=1010
这里是“硬件”?版本:
function processResize(percent) {
var size = percent * 0.01;
var sw = canvas.width * size;
var sh = canvas.height * size;
ctx.drawImage(canvas2, 0, 0, sw, sh);
ctx.drawImage(canvas, 0, 0, sw, sh, 0, 0, w, h);
}
【问题讨论】:
-
在你的蛮力上,似乎有一个无限循环+你在一个循环中调用 getImageData ,而这个操作真的很慢并且消耗内存(因为浏览器必须对画布进行反乘' 像素)。为了避免它,调用它一次,然后从你得到的 arrayBuffer 生成你的图块逻辑。第二种方法应该是最快的,并且至少对于视频来说足够快,并且在我的组合中似乎还可以。没有花时间阅读第三种方法,我不确定实际问题是什么。
-
PS:为了加速动画内容(如视频)的图像处理,您可以首先检查您是否没有在同一帧处理两次无用的处理(使用您的视频元素的
currentTime属性),并使用硬件收缩方法,对较小版本的图像数据进行处理。
标签: javascript performance canvas graphics