Мне удалось применить CSS-карандашный эффект к изображению с этого замечательного сайта .Мне нужно повторить эффект, используя JavaScript drawImage внутри HTML-холста.
Контекст (CanvasRenderingContext2D) рисует изображение, используя свойство фильтра, но я не могу установить для контекста background-size, background-image, background-blend-mode, background-position.Мне нужно, чтобы окончательно отфильтрованное изображение было сохранено в базе данных.Обработка изображений должна выполняться в браузере, а не на стороне сервера.
Любой рабочий фрагмент действительно полезен.
Спасибо!
// Must be onload, otherwise canvas is not ready
window.onload = function() {
let imageWidth = 800
let imageHeight = 600
let canvas = document.getElementById("canvas")
canvas.width = imageWidth
canvas.height = imageHeight
let context = canvas.getContext("2d");
let img = new Image()
img.width = imageWidth
img.height = imageHeight
img.src = "https://bennettfeely.com/image-effects/css/photo.jpg"
let cssfilter = "brightness(2) invert(1) grayscale(1)"
context.filter = cssfilter
/*
// Tried, but it does not work
img.style.backgroundSize = "cover"
img.style.backgroundImage = "url('https://bennettfeely.com/image-effects/css/photo.jp'), url('https://bennettfeely.com/image-effects/css/photo.jp')"
img.style.backgroundPosition = "calc(50% - 1px) calc(50% - 1px), calc(50% + 1px) calc(50% + 1px)"
// img.style = "background-blend-mode: difference; background-position: calc(50% - 1px) calc(50% - 1px), calc(50% + 1px) calc(50% + 1px); filter: brightness(2) invert(1) grayscale(1); box-shadow: inset 0 0 0 1px black;"
*/
// Draw image
context.drawImage(img, 0, 0, imageWidth, imageHeight)
}
@supports (filter: invert(1)) and (background-blend-mode: difference) {
.pencil-effect {
background-size: cover;
background-image: url("https://bennettfeely.com/image-effects/css/photo.jpg"), url("https://bennettfeely.com/image-effects/css/photo.jpg");
background-blend-mode: difference;
background-position: calc(50% - 1px) calc(50% - 1px), calc(50% + 1px) calc(50% + 1px);
filter: brightness(2) invert(1) grayscale(1);
}
}
<img id="original-img" src="https://bennettfeely.com/image-effects/css/photo.jpg" width="800" height="600">
<img class="pencil-effect" width="800" height="600">
<canvas id="canvas" style="background: red"></canvas>