Применение фильтров изображений к данным изображения на холсте или в JavaScript
Я разработчик Flash, и я работаю над портом JavaScript игры. В версии Flash я использую фильтры свечения, размытия и цветовой матрицы для управления внешним видом объектов отображения. Я хотел бы сделать то же самое с моим представлением JavaScript. Некоторые из них являются украшениями, в то время как другие используются для тщательного получения желаемого результата. Поскольку целью этого проекта является создание точного порта, мне интересно, какие параметры я должен применить фильтры к необработанным данным canvas, встроенным тегам SVG или прямые элементы DOM.
Я рассматривал Pixastic, но мой сотрудник настаивает на лицензии GPL на данный момент, что означает, что любая технология, которую я использую, должна быть совместима с GPL. Pixastic использует публичную лицензию Mozilla, поэтому я не могу ее использовать. (Это огромный облом, скажу я вам.)
Я скажу это еще раз кратко: как эффективно применять пиксельные фильтры к элементам DOM, данным canvas image или тегам SVG с помощью JavaScript?
4 ответов
вот пример, показывающий некоторую фильтрацию svg:
и соответствующая версия холста:
вот некоторые библиотеки js для canvas делают то, что я думаю, что вы ищете для:
несколько примеров фильтров svg можно найти на http://svg-wow.org (Лицензия CC0).
Я создал библиотеку (контекст-blender) для выполнения эффектов смешивания в стиле Photoshop между HTML-холстами. Это не совсем то, что вам нужно, так как вы хотите, чтобы некоторые фильтры свертки работали на пикселях, отличных от оригинала, но путь кода будет таким же: getImageData()
, портит данные, putImageData
.
Моя библиотека является лицензией MIT, поэтому не стесняйтесь исследовать ее, не опасаясь проблем.
.библиотека js для обработки изображений (включая много типов фильтра AS3, как свертка, colormatrix, карта смещения etc..)
https://github.com/foo123/FILTER.js
PS Я автор
лучший способ фильтрации изображений в 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);
Runnable пример предыдущего фильтры:
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>