Я работаю над приложением на основе Openlayers.Он в основном отображает изображение, и пользователь может рисовать на изображении геометрические объекты, такие как линии, многоугольники и т. Д., Щелкая мышью.
Мне нужно реализовать функцию, при которой пользователь может изменять яркость изображения, перемещая ползунок.
Я следую по этой ссылке. Я поместил свой код манипуляции пикселями в метод 'updateBrightness', как показано в ссылке.
imageLayer.on('postcompose', (event) => {
this.updateBrightness(this.currentBrightness, event.context);
});
updateBrightness(val, ctx) {
if(ctx && this.currentImageData){
ctx.putImageData(this.currentImageData, 0, 0);
this.map.render;
return;
}
var brightnessVar = val - this.currentBrightness;
this.currentBrightness = val;
var canvas = this.map.renderer_.canvas_;
var ctx = canvas.getContext('2d');
var imgData = ctx.getImageData(0,0,canvas.width,canvas.height).data;
var output = ctx.createImageData(canvas.width, canvas.height);
var outputData = output.data;
console.log('Input length:' + imgData.length)
for (var i = 0; i < imgData.length; i += 4) {
outputData[i] = imgData[i] + brightnessVar;
if(outputData[i] > 255) {
outputData[i] = 255;
}
outputData[i + 1] = imgData[i + 1] + brightnessVar;
if(outputData[i + 1] > 255) {
outputData[i + 1] = 255;
}
outputData[i + 2] = imgData[i + 2] + brightnessVar;
if(outputData[i + 2] > 255) {
outputData[i + 2] = 255;
}
outputData[i + 3] = imgData[i + 3];
}
console.log('Output length:' + output.data.length)
ctx.putImageData(output, 0, 0);
this.map.render;
this.currentImageData = output;
}
Так что этот метод теперь называетсяиз двух сценариев: один, когда пользователь действует на ползунок (аргумент ctx не определен), и второй, когда пользователь выполняет какое-либо действие с изображением, например щелчок мышью по изображению (определен аргумент ctx).
блок ifПраво на начало метода необходимо решить, что при нажатии на изображение (т. е. с действительным CTX) первоначальная яркость восстанавливается.Поэтому я отслеживаю изменение данных пикселей (currentImageData), и если вызов выполняется с действительным ctx, я просто помещаю текущие данные пикселей (currentImageData) в ctx, отрисовываю карту и возвращаю.
ПРИМЕЧАНИЕ. Создается впечатление, что вызов из контекста postcompose пытается восстановить исходные данные пикселей.Но я не уверен.
Теперь перейдем к вопросу, с которым я сталкиваюсь в следующем коде: если пользователь нажимает на изображение, геометрические объекты на изображении дублируются.Каждая функция теперь покрыта другой аналогичной функцией.И если изображение панорамируется, можно увидеть дублированные элементы (изображение прилагается).
Дублированные элементы
В чем здесь ошибка?
РЕДАКТИРОВАТЬ: поднял проблему GitHub тоже: GITHUB проблема