Как сохранить изменения в моем изображении после каждого шага?

#javascript #html #css

Вопрос:

Я создаю веб-приложение для редактирования фотографий, и всякий раз, когда я делаю одно изменение в своем изображении, другое исчезает. Например, если я поворачиваю изображение, то сальто работает неправильно. Он переворачивает только исходное изображение. Мне, вероятно, нужно сохранять свое изображение после каждого изменения. Как мне это сделать?

Вот мой HTML:

 <p><input type="file" accept="image/*" name="image" id="file" onchange="loadFile(event)" style="display: none;"></p> <p><label for="file" style="cursor: pointer;" id="fileBtn">Upload Image</label></p> <p><img id="img" /></p>  <!-- side nav --> <div class="sidenav">  <label for="filter-select">FILTER AND ADJUST</label>  <div class="slider">  <p style="color: aliceblue;">Sepia</p>  <input id="sepia" type="range" oninput="setSepia(this);" value="0" step="0.1" min="0" max="1"><span id="Amount" style="color: white;"> (0)</span><br/><br>   <p style="color: aliceblue;">Grayscale</p>  <input id="Grayscale" type="range" oninput="setGs(this);" value="0" step="0.1" min="0" max="1"><span id="Amount2" style="color: white;"> (0)</span><br/><br>  </div>  <label onclick = "RotateImg()">ROTATE</label>  <label onclick = "flipping()">FLIP</label> </div>  

И вот мой Javascript:

 function loadFile(event) {  var image = document.getElementById('img');  image.src = URL.createObjectURL(event.target.files[0]); }  function setSepia(e){  document.getElementById('img').style["webkitFilter"] = "sepia(" e.value ")";  document.getElementById('Amount').innerHTML="(" e.value ")"; }  function setGs(e){  document.getElementById('img').style["webkitFilter"] = "grayscale(" e.value ")";  document.getElementById('Amount2').innerHTML="(" e.value ")"; }  let rotation = 0; function RotateImg(){  rotation  = 90;  if (rotation == 360) {  rotation = 0;  }  document.querySelector("img").style.transform = `rotate(${rotation}deg)`; }  let scale = 1 function flipping() {  scale -= 2  if (scale <= -2) {  scale = 1;  }  document.querySelector('img').style.transform = `scaleX(${scale})`; }  

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

1. Вы увидите, что каждый раз применяете код к img тегу, а не к измененному или чему-то еще

Ответ №1:

Если вы сохраните все параметры в объекте и после их обновления примените их все, это должно сработать.

Я обновил все необходимые методы ниже:

 function loadFile(event) {  var image = document.getElementById("img");  image.src = URL.createObjectURL(event.target.files[0]); }  const options = {  sepia: 0,  grayscale: 0,  rotation: 0,  scale: 1, };  function setSepia(e) {  options.sepia = e.value;  document.getElementById("Amount").innerHTML = "("   e.value   ")";  redraw(); }  function setGs(e) {  options.grayscale = e.value;  document.getElementById("Amount2").innerHTML = "("   e.value   ")";  redraw(); }  let rotation = 0;  function RotateImg() {  rotation  = 90;  if (rotation == 360) {  rotation = 0;  }  options.rotation = rotation;  redraw(); }  let scale = 1;  function flipping() {  scale -= 2;  if (scale <= -2) {  scale = 1;  }  options.scale = scale;  redraw(); }  function redraw() {  document.getElementById("img").style["webkitFilter"] =  "sepia("   options.sepia   ") grayscale("   options.grayscale   ")";  document.querySelector(  "img"  ).style.transform = `rotate(${options.rotation}deg) scaleX(${options.scale})`; } 
 <p><input type="file" accept="image/*" name="image" id="file" onchange="loadFile(event)" style="display: none;"></p> <p><label for="file" style="cursor: pointer;" id="fileBtn">Upload Image</label></p> <p><img id="img" src="https://wallpapersdsc.net/wp-content/uploads/2016/09/Charleston-Images.jpg" style="width:200px;height:200px" /></p>  <!-- side nav --> <div class="sidenav">  <label for="filter-select">FILTER AND ADJUST</label>  <div class="slider">  <p style="color: aliceblue;">Sepia</p>  <input id="sepia" type="range" oninput="setSepia(this);" value="0" step="0.1" min="0" max="1"><span id="Amount" style="color: white;"> (0)</span><br/><br>   <p style="color: aliceblue;">Grayscale</p>  <input id="Grayscale" type="range" oninput="setGs(this);" value="0" step="0.1" min="0" max="1"><span id="Amount2" style="color: white;"> (0)</span><br/><br>  </div>  <label onclick="RotateImg()">ROTATE</label>  <label onclick="flipping()">FLIP</label> </div> 

Изменить: чтобы уточнить, почему значения сбрасываются, необходимо переопределить старое значение всякий раз, когда вы меняете одно из свойств новым значением.

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

1. Спасибо, это работает нормально, но когда мы загружаем наше изображение и используем функцию фильтрации или поворота, изображение исчезает и не появляется, пока мы не нажмем «Перевернуть». Однако после этого изменения работают нормально. Есть идеи, как мы можем решить эту проблему?

2. Я обновил ответ небольшим исправлением. Шкала options.scale была установлена на 0 вместо 1. Это изменение должно устранить проблему