Должен быть способ сделать это. Я нарисовал фигуру с помощью холста html5 и хотел бы ее размыть. Насколько я знаю, собственного метода нет, поэтому я предполагаю, что нужна библиотека js. Проблема в том, что большинство библиотек размывают только изображения, такие как, например, этот. Это возможно?
Фильтр размытия формы холста html
Ответы (5)
myContext.filter = 'blur(10px)';
Свойство CanvasRenderingContext2D.filter Canvas 2D API обеспечивает эффекты фильтрации, такие как размытие или масштабирование серого. Он похож на свойство фильтра CSS и принимает те же функции. https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/filter
это все еще экспериментально, но поддерживается банкоматами Chrome и Firefox.
вы можете использовать CSS для размытия холста. Если это просто фигура, которую вы хотите размыть, тогда фигура должна быть на отдельном слое (холсте), который вы можете создать на лету.
Пример:
canvas.style.webkitFilter = "blur(3px)";
Вы можете снова отменить размытие холста с помощью:
canvas.style.webkitFilter = "blur(0px)";
Это, вероятно, самый быстрый (и самый простой) способ размыть холст - особенно для мобильных устройств.
Для быстрого размытия, которое почти по Гауссу, я бы рекомендовал StackBlur: http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html
В качестве альтернативы вы можете использовать это Superfast Box Blur с двумя итерациями: http://www.quasimondo.com/BoxBlurForCanvas/FastBlurDemo.html
Пример библиотеки pixastic, с которой вы связались, должен фактически работать с элементом холста в качестве первого аргумента, а не с изображением.
По умолчанию библиотека pixastic попытается заменить переданный вами узел на созданный ею элемент холста. Чтобы предотвратить это, вы можете включить параметр, чтобы указать, чтобы он оставил узел DOM и включил обратный вызов для самостоятельной обработки возвращенных данных. Что-то вроде этого:
Pixastic.process(canvas, "blur", { leaveDOM: true }, function(img) {
canvas.getContext('2d').drawImage(img, 0, 0);
});
В качестве альтернативы, если вы не хотите зависеть от библиотеки, вы можете реализовать размытие самостоятельно с помощью getImageData (), манипулируя возвращаемыми данными пикселей и используя putImageData () для отрисовки размытого изображения обратно на холст.
Еще одна вещь, на которую следует обратить внимание, заключается в том, что обработка отдельных пикселей выполняется медленно и может не работать для больших изображений. Если это проблема, вы можете попробовать уменьшить масштаб изображения и снова увеличить, чтобы быстро получить эффект размытия. Что-то вроде этого:
ctx.drawImage(canvas, 0, 0, canvas.width / 2, canvas.height / 2);
ctx.drawImage(canvas, 0, 0, canvas.width / 2, canvas.height / 2, 0, 0, canvas.width, canvas.height);
https://github.com/nodeca/glur - он реализует размытие по Гауссу через фильтр IIR. Смотрите демонстрации.