Я уже создаю код jsfiddle.net/NHj2t для изображения downsample, но у меня есть одна проблема: на холсте у меня есть дубликат изображения, и я не понимаю, почему - пожалуйста, объясните мне.
function downsample(srcImageData, width, height) {
var backContext = document.createElement('canvas').getContext('2d');
var result = backContext.createImageData(width, height);
var d = 0;
for (var p = 0; p < srcImageData.data.length; p += 8) {
result.data[d] = srcImageData.data[p];
result.data[d + 1] = srcImageData.data[p + 1];
result.data[d + 2] = srcImageData.data[p + 2];
result.data[d + 3] = srcImageData.data[p + 3];
d += 4;
}
srcImageData = result;
return srcImageData;
}
Как удалить каждый второй пиксель с холста?
Я хочу уменьшить изображение. Я пытаюсь реализовать Gaussian Pyramid в JavaScript info 1
Я не очень хорошо понимаю английский.
Вы принимаете каждый второй пиксель, но только горизонтально. Чтобы получить то, что вы хотите, вам нужно также пропускать каждый второй пиксель по вертикали. После того, как вы обработали width
числа пикселей, вы хотите пропустить целую линию пикселей, то есть width
пикселя width
вперед. Надеюсь, вы понимаете, что я пытаюсь сказать.
var backContext = document.createElement('canvas').getContext('2d');
var skip = 2;
var result = backContext.createImageData(width/skip, height/skip);
var d = 0;
for (var y = 0; y < height; y += skip) {
for (var x = 0; x < width; x += skip) {
for (var c = 0; c < 4; c++) {
result.data[d++] = srcImageData.data[(y*width+x)*4+c];
}
}
}
Обновленная скрипка: http://jsfiddle.net/NHj2t/2/
Вы в основном создаете две чередующиеся версии исходного изображения, одну нечетную строку и одну четную линию.
Пропуская 2 пикселя в источнике, вы будете рисовать только половину строк, где один "отстает", в результате чего две линии бок о бок (каждая другая строка, следовательно, "чередуется"). Если вы захотите этого с помощью пиксельной итерации, вам нужно вычислить и рассмотреть вертикальную позицию.
Почему бы не использовать drawImage
для пробоподготовки изображения?
context.drawImage(img, 0, 0, img.width * 0.5, img.height * 0.5);
Это нарисует ваше изображение размером 50%.