8

我是一名 Flash 开发人员,我正在开发游戏的 JavaScript 端口。在 Flash 版本中,我使用发光、模糊和颜色矩阵过滤器来处理显示对象的外观。我想对我的 JavaScript 视图做同样的事情。其中一些是点缀,而另一些则用于精心制作所需的结果。因为这个项目的目标是创建一个精确的端口,我想知道我必须使用哪些选项来将过滤器应用于原始画布数据、内联 SVG 标记或直接处理 DOM 元素。

我考虑过 Pixastic,但我的合作者暂时坚持使用 GPL 许可证,这意味着我使用的任何技术都必须与 GPL 兼容。Pixastic 使用 Mozilla Public License,所以我不能使用它。(这是一个巨大的无赖,让我告诉你。)

我将再次简洁地说:如何有效地将像素过滤器应用于 DOM 元素、画布图像数据或使用 JavaScript 的 SVG 标签?

4

4 回答 4

6

这是一个显示一些 svg 过滤的示例:

和相应的画布版本:

以下是一些用于画布的 js 库,可以满足您的需求:

可以在http://svg-wow.org(CC0 许可)上找到许多 svg 过滤器示例。

于 2011-01-10T08:59:53.053 回答
3

我创建了一个库 ( context-blender ),用于在 HTML 画布之间执行 Photoshop 风格的混合效果。这并不完全是您所需要的,因为您希望一些卷积过滤器在原始像素以外的像素上运行,但代码路径将是相同的:getImageData()、处理数据、putImageData.

我的库恰好是 MIT 许可证,因此请随意在那里进行调查,而不必担心出现问题。

于 2011-01-10T17:13:27.897 回答
1

用于图像处理的 Filter.js 库(包括许多 AS3 过滤器类型,如卷积、颜色矩阵、置换图等)

https://github.com/foo123/FILTER.js

PS我是作者

于 2013-09-07T23:00:22.090 回答
1

在 Javascript 中过滤图像的最佳方法是通过图像处理框架。一些纯 Javascript 选项:

对于MarvinJ,使用以下代码加载您的图像:

var image = new MarvinImage();
image.load("https://i.imgur.com/By6tvip.jpg", imageLoaded);

我将使用以下输入图像来演示一些过滤器:

在此处输入图像描述

灰度:

 Marvin.grayScale(image, imageOut);

在此处输入图像描述

黑与白:

Marvin.blackAndWhite(image, imageOut, 10);

在此处输入图像描述

棕褐色:

Marvin.sepia(image, imageOut, 40);

在此处输入图像描述

浮雕:

Marvin.emboss(image, imageOut);

在此处输入图像描述

边缘检测:

Marvin.prewitt(image, imageOut);

在此处输入图像描述

模糊:

Marvin.gaussianBlur(image, imageOut, 3);

在此处输入图像描述

亮度和对比度:

Marvin.brightnessAndContrast(image, imageOut, 70, 60);

在此处输入图像描述

颜色通道:

Marvin.colorChannel(image, imageOut, 0, 0, 110);

在此处输入图像描述

先前过滤器的可运行示例:

var canvas1 = document.getElementById("canvas1");
var image = new MarvinImage();
image.load("https://i.imgur.com/By6tvip.jpg", imageLoaded);

function imageLoaded(){
	var imageOut = new MarvinImage(image.getWidth(), image.getHeight());
  
	// GrayScale
	Marvin.grayScale(image, imageOut);
	imageOut.draw(canvas1);
	
	// Black and White
	Marvin.blackAndWhite(image, imageOut, 10);
	imageOut.draw(canvas2);
	
	// Sepia
	Marvin.sepia(image, imageOut, 40);
	imageOut.draw(canvas3);
	
	// Emboss
	Marvin.emboss(image, imageOut);
	imageOut.draw(canvas4);
  
	// Edge
	imageOut.clear(0xFF000000);
	Marvin.prewitt(image, imageOut);
	imageOut.draw(canvas5);
  
	// Gaussian Blur
	Marvin.gaussianBlur(image, imageOut, 5);
	imageOut.draw(canvas6);
  
	// Brightness
	Marvin.brightnessAndContrast(image, imageOut, 70, 60);
	imageOut.draw(canvas7);
  
	// Color Channel
	Marvin.colorChannel(image, imageOut, 0, 0, 110);
	imageOut.draw(canvas8);
}
<script src="https://www.marvinj.org/releases/marvinj-0.7.js"></script>
<canvas id="canvas1" width="192" height="120"></canvas>
<canvas id="canvas2" width="192" height="120"></canvas>
<canvas id="canvas3" width="192" height="120"></canvas>
<canvas id="canvas4" width="192" height="120"></canvas>
<canvas id="canvas5" width="192" height="120"></canvas>
<canvas id="canvas6" width="192" height="120"></canvas>
<canvas id="canvas7" width="192" height="120"></canvas>
<canvas id="canvas8" width="192" height="120"></canvas>

于 2018-01-04T02:00:04.147 回答