HTML5 холст манипуляции пикселей с imageData
Я пытаюсь создать какую-то черно-белую копию такого изображения
для некоторых картинок это работает отлично, а для некоторых картинок я получаю этот искаженный результат, как вы можете видеть по ссылке.
это мой код:
var imageData = ctx.createImageData(c.width, c.height);
for (var i=0; i < imageData.data.length; i+=4)
{
if (someLogicRefferingToOriginalImageData == true) {
imageData.data[i+0] = 255;
imageData.data[i+1] = 255;
imageData.data[i+2] = 255;
imageData.data[i+3] = 255;
}
else
{
imageData.data[i+0] = 0;
imageData.data[i+1] = 0;
imageData.data[i+2] = 0;
imageData.data[i+3] = 255;
}
}
ctx.putImageData(imageData,0 ,0);
2 ответа
Глядя на ваш код, он должен работать. Вместо этого попробуйте поработать с 32-битным массивом, который представляет собой один элемент массива на пиксель вместо 4, что должно избежать любых ошибок при неправильном подсчете элементов:
var imageData = ctx.createImageData(c.width, c.height);
var buffer = new Uint32Array(imageData.data.buffer);
for (var i=0; i < buffer.length; i++) {
if (someLogicRefferingToOriginalImageData == true) {
buffer[i] = 0xFFFFFFFF;
} else {
buffer[i] = 0xFF000000;
}
}
imageData.data.set(new Uint8ClampedArray(buffer));
ctx.putImageData(imageData, 0, 0);
У вас есть правильная идея прохождения каждого пикселя, но вы не можете просто сделать определенные пиксели белыми, а некоторые пиксели черными.
Каждый пиксель должен управляться относительно его существующего значения. Есть формулы для определенных фильтров, включая B&W. Алгоритм яркости, кажется, то, что вы ищете. Возможно, эта ссылка укажет вам правильное направление для черно-белых.