【问题标题】:Adding greyscale fx to a class using JavaScript?使用 JavaScript 向类添加灰度效果?
【发布时间】:2011-11-28 09:06:51
【问题描述】:

我正在尝试使用 jQuery 为每个具有 greyscale 类的图像添加灰度效果,但以下似乎不起作用。有没有人知道为什么这可能不起作用?

    $(function(){

        var imgObj = $('.greyscale');       
       var canvas = document.createElement('canvas');
        var canvasContext = canvas.getContext('2d');
        var imgW = imgObj.width;
        var imgH = imgObj.height;
        canvas.width = imgW;
        canvas.height = imgH;

        canvasContext.drawImage(imgObj, 0, 0);
        var imgPixels = canvasContext.getImageData(0, 0, imgW, imgH);

        for(var y = 0; y < imgPixels.height; y++){
            for(var x = 0; x < imgPixels.width; x++){
                var i = (y * 4) * imgPixels.width + x * 4;
                var avg = (imgPixels.data[i] + imgPixels.data[i + 1] + imgPixels.data[i + 2]) / 3;
                imgPixels.data[i] = avg; 
                imgPixels.data[i + 1] = avg; 
                imgPixels.data[i + 2] = avg;
            }
        }

        canvasContext.putImageData(imgPixels, 0, 0, 0, 0, imgPixels.width, imgPixels.height);
        return canvas.toDataURL();
 }); 

【问题讨论】:

  • 请注意,如果页面未托管在服务器上,getImageData 将无法工作。

标签: javascript jquery html5-canvas grayscale


【解决方案1】:

你目前做错的是:

  • 绘制 jQuery 对象而不是画布
  • 在就绪处理程序中返回数据 URL,这似乎没有意义

你应该做的是:

  • 遍历所有图像元素,对每个画布执行以下操作:
    • 制作灰度版本
    • 将图片href设置为灰度画布的数据URL

点赞:http://jsfiddle.net/eGjak/140/

$(window).load(function() { // wait for images to load also
    var imgObj = $('.greyscale');
    return imgObj.each(function() {
        var canvas = document.createElement('canvas');
        var canvasContext = canvas.getContext('2d');
        var imgW = this.width;
        var imgH = this.height;
        canvas.width = imgW;
        canvas.height = imgH;

        canvasContext.drawImage(this, 0, 0);
        var imgPixels = canvasContext.getImageData(0, 0, imgW, imgH);

        for(var y = 0; y < imgPixels.height; y++){
            for(var x = 0; x < imgPixels.width; x++){
                var i = (y * 4) * imgPixels.width + x * 4;
                var avg = (imgPixels.data[i] + imgPixels.data[i + 1] + imgPixels.data[i + 2]) / 3;
                imgPixels.data[i] = avg; 
                imgPixels.data[i + 1] = avg; 
                imgPixels.data[i + 2] = avg;
            }
        }

        canvasContext.putImageData(imgPixels, 0, 0, 0, 0, imgPixels.width, imgPixels.height);
        console.log(canvas.toDataURL())
        this.src = canvas.toDataURL();
    });
});

【讨论】:

  • 我所拥有的是一个灰度类的图像,我想将其移动到画布上,然后将画布转换为灰度。
  • 请看chillwebdesigns.co.uk/test/gs/gs.htm为什么你认为画布和图片不一样?
  • @Chill Web Designs:你能尝试使用$(window).load 代替准备好的处理程序吗?图片必须先加载,ready 函数 ($(function(){})) 不等待图片,而只等待 DOM。
  • 发现问题了,它获取的是真实的图像尺寸,而不是CSS中指定的尺寸。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
  • 2012-07-03
  • 2013-03-12
  • 2018-02-06
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
相关资源
最近更新 更多