#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.