Применение фильтров изображений к данным изображения холста или в JavaScript

Я разработчик Flash и работаю над портированием игры на JavaScript. В версии Flash я использую фильтры свечения, размытия и цветовой матрицы для управления внешним видом экранных объектов. Я хотел бы сделать то же самое с моим представлением JavaScript. Некоторые из них являются украшениями, а другие используются для тщательного достижения желаемого результата. Поскольку целью этого проекта является создание точного порта, мне интересно, какие варианты у меня есть для применения фильтров к необработанным данным холста, к встроенным тегам SVG или к прямым элементам DOM.

Я рассматривал Pixastic, но мой соавтор пока настаивает на лицензии GPL, что означает, что любая используемая мной технология должна быть совместима с GPL. Pixastic использует общественную лицензию Mozilla, поэтому я не могу ее использовать. (Позвольте мне вам сказать, что это большой облом.)

Я скажу это еще раз кратко: как мне эффективно применять пиксельные фильтры к элементам DOM, к данным изображения холста или к тегам SVG с помощью JavaScript?


person Rezmason    schedule 10.01.2011    source источник
comment
Вы просили автора сменить лицензию Pixastic или двойную? Интересно, есть ли у него какая-то особая причина использовать MPL вместо BSD или какой-либо другой популярной альтернативы ...   -  person Juho Vepsäläinen    schedule 10.01.2011


Ответы (4)


Вот пример, показывающий некоторую фильтрацию svg:

и соответствующая версия холста:

Вот несколько js-библиотек для холста, которые, как мне кажется, делают то, что вы ищете:

Ряд примеров фильтров svg можно найти на http://svg-wow.org (с лицензией CC0).

person Erik Dahlström    schedule 10.01.2011
comment
Вот отличная демонстрация stackblur, quasimondo.com/StackBlurForCanvas/StackBlurtml. - person Juho Vepsäläinen; 10.01.2011
comment
Квазимондо - мужчина, не так ли? Думаю, я воспользуюсь этим StackBlur, если мой знакомый с GPL не увидит причин, по которым я этого не сделаю. BitmapData.js выглядит очень эффективным для некоторых других операций, хотя я не узнаю наверняка, пока не попробую. - person Rezmason; 11.01.2011

Я создал библиотеку (context-blender) для выполнения эффектов наложения в стиле Photoshop между холстами HTML. Это не совсем то, что вам нужно, поскольку вы хотите, чтобы некоторые фильтры свертки работали на пикселях, отличных от оригинала, но путь кода будет таким же: getImageData(), изменить данные, putImageData.

Моя библиотека имеет лицензию MIT, так что не стесняйтесь исследовать ее, не опасаясь проблем.

person Phrogz    schedule 10.01.2011

Библиотека Filter.js для обработки изображений (включая многие типы фильтров AS3, такие как свертка, цветовая матрица, карта смещения и т. Д.)

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

PS я автор

person Nikos M.    schedule 07.09.2013

Лучший способ фильтровать изображения в Javascript - это использовать фреймворк для обработки изображений. Некоторые варианты чистого Javascript:

В случае MarvinJ используйте следующий код для загрузки изображения:

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

Я буду использовать следующее входное изображение, чтобы продемонстрировать некоторые фильтры:

введите описание изображения здесь

GrayScale:

 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);

введите описание изображения здесь

Runnable example of the previous filters:

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>

person Gabriel Ambrósio Archanjo    schedule 04.01.2018