【问题标题】:html5 getImageData then putImageData results in fading imagehtml5 getImageData 然后 putImageData 导致图像褪色
【发布时间】:2012-06-10 08:12:40
【问题描述】:

我对 Html5 很陌生,我想知道是否有人可以对此有所了解:

<script type="text/javascript">
        window.onload = function () {

            var canvas = document.getElementById('canvas'); //682 x 111 pixel canvas
            var context = canvas.getContext('2d');

            var image = new Image();
            image.src = "/Content/ImageTestOne/logo-for-dissolve.png"; //682 x 111 pixel image
            image.onload = function () { context.drawImage(image, 0, 0); drawFrame(); };

            function drawFrame() {

                window.requestAnimationFrame(drawFrame, canvas);

                imageData = context.getImageData(0, 0, canvas.width, canvas.height);

                //Do something to some pixels here that persists over time

                context.clearRect(0, 0, canvas.width, canvas.height);

                context.putImageData(imageData, 0, 0);
            };

       };
</script>

根据我对 Html5 的有限知识,该代码除了不断显示“图像”之外什么都不做。但相反,图像很快就会烧成几乎白色,这表明每次从画布读取或写入画布时 imageData 都会发生轻微变化......

基本上我想淡化鼠标所在的图像,以便在鼠标移动时显示背景图像。有没有办法解决这个问题,还是我必须在这个过程中变得更有创意?无论如何我可以操纵“图像” ImageData 而不是每次都从画布中获取它?

在此先感谢,我尝试使用 jpg 和 png 并加载到 DOM 而不是通过 image.src,但它们都有相同的问题。

使用最新的 Chrome 顺便说一句。

下面是 requestionAnimationFrame 的设置,用于处理故障转移到 SetTimeout 的一系列浏览器:

(!window.requestAnimationFrame)
{
    window.requestAnimationFrame = (window.webkitRequestAnimationFrame ||
                    window.mozRequestAnimationFrame ||
                    window.oRequestAnimationFrame ||
                    window.msRequestAnimationFrame ||
                    function (callback) {
                        return window.setTimeout(callback, 1000/60);
                    });
}

这是画布的代码

<canvas id="canvas" width="682" height="111"></canvas>

这就是所有的代码。

【问题讨论】:

    标签: html html5-canvas getimagedata putimagedata


    【解决方案1】:

    putImageData() 和 getImageData() 可能是有损的。 the spec 中有一条关于此的注释:

    由于与预乘 alpha 相互转换的有损特性 颜色值,刚刚使用 putImageData() 设置的像素 可能会作为不同的值返回到等效的 getImageData()。

    另请参阅此相关问题: Why does HTML Canvas getImageData() not return the exact same values that were just set?

    【讨论】:

      【解决方案2】:

      我也尝试将它应用到我的游戏中,我将在其中操纵选定的像素以产生效果,但它并没有给我预期的结果

      这里是一些我用来操作像素改变的示例代码

      获取图片信息并存储

      var img = context.getImageData(0,0, width, height)
      var imgdata = img.data
      var len = imgdata.length
      

      循环到所有数据并操作像素信息

      var i = 0;
      
      for(i; i<leng; i++) {
          var red = imgdata[i]
          var green = imgadata[i+1]
          var blue = imgdata[i+2]
          var alpha = imgdata[i+3]
      
          imgdata[i] = new value
          imgdata[i+1] = new value
          imgdata[i+2] = new value
          imgdata[i+3] = new value
      }
      

      context.putImageData(img, 0,0)

      然后创建动画帧看看效果

      【讨论】:

        【解决方案3】:

        requestAnimationFrame 是一项实验性功能(2012 年 6 月),它使用基于时间的帧访问。这样做的原因是避免动画中的延迟。 我建议你看看这个Moz article

        【讨论】:

        • 如果您阅读了我提供的文章,您可能已经注意到缺少帧指针。
        • 我没有丢失帧指针,因为我说 window.requestAnimationFrame 没有包含在上面的代码中,因为我认为它不相关。这不是延迟问题 - 阅读我遇到的症状 - 我有一些运行相同代码的复杂粒子动画并且它们运行完美 - 这与我相信 getImageData 和 putImageData 之间的图像数据变化有关。请注意,我说“这段代码应该什么都不做!” (如果它工作正常)那么为什么图像会随着时间的推移迅速退化?
        • @Rob,我无法在 FF14.0 上重现该问题,您能否修改实际代码?你用的是什么浏览器?我确实注意到我的一个 png 文件出现了故障。也许值得尝试使用不同的图像!
        • 我正在使用 Chrome - 我回家后会在 FF 中检查它并将其余代码发布到问题区域 - 由于交叉,我无法在 JS fiddle 中运行它-domain getImageData 限制......除非有办法绕过它。
        • @rob 我已经尝试过 chrome,但仍然无法重现问题。 WRT 您的实际需求:我建议您在屏幕外更改鼠标位置的 Alpha 通道。 var idx = (x + (y * imagedata.width)) * 4; imagedata.data[idx+3] = 0; //alpha通道....然后重置原始背景图片和putimagedata(imagedata...
        猜你喜欢
        • 1970-01-01
        • 2021-12-04
        • 2011-11-10
        • 2014-10-02
        • 2012-10-13
        • 2010-11-29
        • 1970-01-01
        • 2011-07-09
        相关资源
        最近更新 更多