Добавление оттенков серого в класс с помощью JavaScript?

#javascript #jquery #html5-canvas #grayscale

#javascript #jquery #html5-холст #оттенки серого

Вопрос:

Я пытаюсь использовать 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();
 }); 
  

Комментарии:

1. Обратите внимание, что getImageData не будет работать, если страница не размещена на сервере.

Ответ №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();
    });
});
  

Комментарии:

1. У меня есть изображение с классом greyscale, которое я хочу переместить на холст, а затем преобразовать холст в оттенки серого.

2. Пожалуйста, посмотрите chillwebdesigns.co.uk/test/gs/gs.htm как вы думаете, почему холст не делается таким же, как изображения?

3. @Chill Web Designs: Не могли бы вы попробовать использовать $(window).load вместо готового обработчика? Изображения должны загружаться первыми, и ready функция ( $(function(){}) ) не ожидает изображений, а только DOM.

4. Обнаружена проблема, он получает реальный размер изображения, а не размер, указанный в CSS.