如何使用 JavaScript 在 html 画布中为特殊过滤器绘制图像

克里斯蒂吉尼亚

我已经成功地将 CSS 铅笔效果应用于来自这个伟大网站的图像我需要在 HTML 画布中使用 JavaScript drawImage 复制效果。

上下文 (CanvasRenderingContext2D) 使用过滤器属性绘制图像,但我无法设置为上下文背景大小、背景图像、背景混合模式、背景位置。我需要将最终过滤后的图像保存在数据库中。图像处理必须在浏览器上,而不是在服务器端。

任何工作片段都非常有用。

谢谢!

//  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>

海道

通过逐步重现 CSS 正在执行的操作,您可以从 2D 上下文 API 获得相同的效果。

第一步是绘制偏移量为 -1 -1 的图像(第一个背景图像)。这可以通过使用轻松实现drawImage()

const img = new Image();
img.onload = function() {
  const imageWidth = 800
  const imageHeight = 600
  const canvas = document.getElementById("canvas");
  canvas.width = imageWidth;
  canvas.height = imageHeight;
  const context = canvas.getContext("2d");

// first pass without any filter nor blending
  // simple offset
  context.drawImage(img, -1, -1, imageWidth, imageHeight)
};
img.src = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/56/Point_Reyes_Lighthouse_%28April_2012%29.jpg/593px-Point_Reyes_Lighthouse_%28April_2012%29.jpg";
<canvas id="canvas" style="background: red"></canvas>

第二步是将此图像与自身的副本混合,在另一个方向上有轻微的偏移。
difference混合模式是还通过其2D背景的API可用globalCompositeOperation属性:

const img = new Image();
img.onload = function() {
  const imageWidth = 800
  const imageHeight = 600
  const canvas = document.getElementById("canvas");
  canvas.width = imageWidth;
  canvas.height = imageHeight;
  const context = canvas.getContext("2d");

// first pass without any filter nor blending
  // simple offset
  context.drawImage(img, -1, -1, imageWidth, imageHeight)
// second pass, do the blending without filter
  context.globalCompositeOperation = 'difference';
  // note how we draw the canvas over itself with the counter offset
  context.drawImage(img, 1, 1, imageWidth, imageHeight);
};
img.src = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/56/Point_Reyes_Lighthouse_%28April_2012%29.jpg/593px-Point_Reyes_Lighthouse_%28April_2012%29.jpg";
<canvas id="canvas" style="background: red"></canvas>

最后一步是brightness(2) invert(1) grayscale(1)在这个混合图像上应用 CSS 过滤器
再一次,2D 上下文 API 可以通过它的filter属性来做到这一点

const img = new Image();
img.onload = function() {
  const imageWidth = 800
  const imageHeight = 600
  const canvas = document.getElementById("canvas");
  canvas.width = imageWidth;
  canvas.height = imageHeight;
  const context = canvas.getContext("2d");
  const cssfilter = "brightness(2) invert(1) grayscale(1)" 

// first pass without any fiter nor blending
  // simple offset
  context.drawImage(img, -1, -1, imageWidth, imageHeight)
// second pass, do the blending without filter
  context.globalCompositeOperation = 'difference';
  // note how we draw the canvas over itself with the counter offset
  context.drawImage(img, 1, 1, imageWidth, imageHeight);

// third pass, apply the filter on the blended result
  context.filter = cssfilter;
  // since there is no transparency we could also have set it to 'source-over'
  context.globalCompositeOperation = 'copy';
  // here we don't set any offset: we only apply the filter
  context.drawImage(context.canvas, 0, 0, imageWidth, imageHeight)
};
img.src = "https://upload.wikimedia.org/wikipedia/commons/thumb/5/56/Point_Reyes_Lighthouse_%28April_2012%29.jpg/593px-Point_Reyes_Lighthouse_%28April_2012%29.jpg";
<canvas id="canvas" style="background: red"></canvas>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用javascript在html5中绘制图像

来自分类Dev

如何在javascript中(没有CSS和HTML)在图像上绘制图像

来自分类Dev

如何在HTML5画布内旋转图像而不绘制图像?

来自分类Dev

javascript在画布上绘制图像

来自分类Dev

javascript画布不会绘制图像

来自分类Dev

如何获得画布中每次绘制图像的参考?

来自分类Dev

如何获得画布中每次绘制图像的参考?

来自分类Dev

Javascript Canvas如何绘制图像很多图像

来自分类Dev

如何在canvas-html5中绘制图像并替换为现有函数

来自分类Dev

HTML Range元素可使用JavaScript更改CSS图像过滤器

来自分类Dev

如何使用JavaScript在HTML中显示图像

来自分类Dev

如何为JavaScript调整工作HTML Angular过滤器

来自分类Dev

使用javascript从图像中删除灰度css过滤器

来自分类Dev

使用XSS过滤器将文本链接转换为Javascript中的多种HTML格式

来自分类Dev

画布HTML5中绘制图像对象的限制区域

来自分类Dev

无法在Phonegap中的HTML5画布上绘制图像

来自分类Dev

如何使用javascript过滤垂直html表

来自分类Dev

如何使用画布绘制图片

来自分类Dev

如何使用 Javascript 在 HTML 中添加变量

来自分类Dev

如何在画布上分层绘制图像?

来自分类Dev

如何使用javascript过滤器功能

来自分类Dev

如何使用javascript将图像标签设置为html表?

来自分类Dev

如何使用SDWebImage在cgcontext中绘制图像

来自分类Dev

如何使用JavaScript在HTML5 Canvas中绘制圆?

来自分类Dev

如何在运行时添加/删除一些过滤器以绘制图形?

来自分类Dev

Javascript画布:绘制图片

来自分类Dev

如何使用TextureBrush绘制图像

来自分类Dev

如何使用GCD绘制图像?

来自分类Dev

清除画布后未绘制图像(html5画布)

Related 相关文章

热门标签

归档