【问题标题】:HTML5 Canvas Re-Colorize Images *Before* RenderingHTML5 Canvas 重新着色图像 *在*渲染之前
【发布时间】:2013-03-14 01:43:20
【问题描述】:

我有一个本质上是星爆效果的图像。星爆的颜色是白色,背景是透明的(PNG w/Alpha)。我在 HTML5 画布上的随机位置随机生成这些星爆,同时生成随机的色相、饱和度和亮度 (HSL) 值。这些可能是 RGB 值,如果这样可以简化事情的话。

目标是在将 PNG 渲染到画布之前,根据随机生成的 HLS 值重新着色 PNG 以在 HTML5 画布上显示。

我在 StackOverflow 和其他网站上阅读了一些其他帖子,但我看到的唯一解决方案是将其渲染到画布上,获取图像显示位置的坐标,并以像素为单位修改颜色-像素基础。理论上这可以工作,但是一些图像可能会略有重叠。此外,如果已经存在背景,那么据我所知,背景的颜色也会被修改,这对我来说也不是什么解决方案。

如果这超出了 Canvases 的能力范围,作为后备,我想我可以使用 GD2 或 Imagick 通过 PHP 动态重新着色图像,或者通过 Gimp、ImageMagick 的命令行或其他一些图片库...

非常感谢!

-- 结果--

特别感谢 @jing3142 对屏幕外画布渲染的初步建议,以及 @Jarrod 提供我缺少的重要部分:globalCompositeOperation = "source-in"

这是该概念的一个工作实现:http://jsfiddle.net/fwtW2/2/

工作于:

  • 火狐
  • IE 9(其他版本未测试)

【问题讨论】:

    标签: php html html5-canvas


    【解决方案1】:

    具有图像大小的第二个画布怎么样,将图像放在该画布上,根据需要重新着色,提取重新着色的图像并随机放置在主画布上,使用重新着色第二个画布上的图像新的 HSL 值,提取并随机放置在主画布上并重复?

    这也可能有帮助https://developer.mozilla.org/en-US/docs/HTML/Canvas/Pixel_manipulation_with_canvas

    【讨论】:

      【解决方案2】:

      我很确定您可以使用source-in globalCompositeOperation 操作?无需对矢量图像进行所有的硬核和疯狂。

      这段代码是魔法发生的地方:

      var color = 'red';
      ctx.fillStyle = color;
      ctx.globalCompositeOperation = "source-in";
      

      但你需要将它重新绘制到屏幕外的画布上:你可以这样做

      createBuffer = function(sizeW, sizeH)
      {
          buffer = document.createElement('buffer');
          bufferCtx = buffer.getContext('2d');
      
          buffer.width = sizeW;
          buffer.height = sizeH;
      

      }

      然后只需将您的图像绘制到屏幕外画布并应用全局合成。

      【讨论】:

      • 我喜欢这样的声音!我一定会试一试,看看这是否符合需求:)
      • 这就是我对位图字体的做法——这意味着我可以提供标准的黑色字体并以任何颜色显示:)
      • globalCompositeOperation = 'source-in'; 绝对是缺失的部分!当我得到一个可靠的实现时,我会分享我的代码,让其他人可能从中受益。非常感谢! :)
      【解决方案3】:

      以下是在画布上渲染之前轻松重新着色星芒的方法

      将您的 starburst.png 转换为矢量路径! (我知道,这一次您将不得不拖出 Gimp/Illustrator ——但这是值得的!)

      Starburst 路径可以有填充,填充可以是纯色甚至是渐变色——根据需要随意重新着色!

      Starburst 路径可以缩放,而无需像 .png 那样对光栅图像进行像素化。

      Starburst 路径可以旋转以显示您的爆发的多样性 - 甚至可以倾斜以表示一些 3d 运动。

      如果你想变得花哨,你甚至可以使用阴影和模糊来创造“发光”的爆发。

      Starburst 路径的渲染速度比 .png 图像要快,尤其是当您需要在绘制之前操作每个 .png 时。

      【讨论】:

      • 所以您的想法是将 PNG 转换为矢量路径,并将该矢量路径传递给 Canvas?
      • 是的,除非您的星爆非常复杂,否则您应该能够使用 gimp/illustrator 中的 .svg 路径来创建画布路径(是的,需要进行一些轻微的手动转换)。实际上,即使它很复杂,绘制矢量而不是栅格的好处也很显着。
      • 关于 GIMP 的笔记,你有没有推荐的矢量路径库?我遇到了registry.gimp.org/node/26303
      • 如果你只有几个星爆图案,只需使用在线 SVG==>Canvas 转换器,如下所示:professorcloud.com/svg-to-canvas 如果你有很多星爆图案,则使用已包含的 fabricJS 画布绘图库一个 SVG==>画布转换器:fabricjs.com
      • 哦,如果你的星爆图相当简单,你可以使用它的绘制路径命令在画布内创建路径:moveTo、lineTo、arcTo 等(画布的绘制功能几乎与 SVG 一样强大——别喷我,伙计们!)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      • 2012-04-19
      • 1970-01-01
      相关资源
      最近更新 更多