JavaScript - Поворот изображения холста, углы обрезаются - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь повернуть изображение внутри HTML canvas. Поворот работает, но при каждом повороте углы изображения обрезаются / обрезаются. Это неправильно, потому что после загрузки все загруженное изображение должно быть целым.

Некоторые важные детали:

  • В моем конкретном случае использования у меня нет доступа к самим данным изображения. Таким образом, загруженное пользователем изображение будет обработано и нарисовано на холсте HTML. Я могу получить доступ только к элементу холста HTML, но не к самому загруженному изображению. Так работает система.
  • Ширина и высота холста должны быть точно такими же, как ширина и высота загружаемого изображения
  • Сам холст должен сохранять свои размеры и не должен поворачиваться, должен вращаться только изображение в нем.
  • Без CSS, его следует архивировать только с помощью JavaScript, поскольку повернутое изображение холста будет загружено на сервер.

Итак, проблема в том, что каждый раз, когда я хочу повернуть изображение на 45 градусов, углы изображения внутри HTML-холста обрезаются / обрезаются. Очевидно, что это не правильно, поскольку все изображение должно быть повернуто. Я не могу понять, что я сделал неправильно, так что, может быть, кто-то может помочь мне дальше?

https://jsfiddle.net/d5zurxq2/

<label>Image File:</label><br/>
<input type="file" id="imageLoader" name="imageLoader"/>
<canvas id="imageCanvas" width=250 height=250></canvas>
<br /><br /><br />
<button type="button" id="rotateLeft">Rotate 45 degrees left</button>


#imageCanvas {
  width: 350px;
  height: 250px;
  background-color: rgba(158, 167, 184, 0.2)
}

var imageLoader = document.getElementById('imageLoader');
    imageLoader.addEventListener('change', handleImage, false);


var canvas  = document.getElementById('imageCanvas');
var ctx     = canvas.getContext("2d");


function handleImage(e){
  var reader            = new FileReader();
  reader.onload         = function(e) {
      var preview       = document.createElement('img');
      preview.onload    = function()
      {
          canvas.width  = preview.width;
          canvas.height = preview.height;
          canvas.getContext('2d').drawImage(preview, 0, 0);
      };

      preview.src = reader.result;
    };

   reader.readAsDataURL(e.target.files[0]);     
}



document.getElementById('rotateLeft').addEventListener('click', rotateImage, 
false);

function rotateImage() {
  var w     = ctx.canvas.width;
  var h     = ctx.canvas.height;
  var ww    = w / 2;
  var hh    = h / 2;

  ctx.save();
  ctx.globalCompositeOperation = "copy";
  ctx.translate(ww, hh);
  ctx.rotate((Math.PI / 180) * 45);
  ctx.drawImage(canvas, -canvas.width/2, -canvas.height/2);
  ctx.restore();
}

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Вы можете сделать это и многое другое с библиотекой Canvate.

http://www.sakuracode.com/canvate

Вы можете загружать все изображения по своему усмотрению и обрабатывать их как отдельные клипы. Вы также можете установить точку поворота. В этом случае посередине.

Тебе нужно что-то подобное?

function rotateImage() {
        clip.rotation = 45;
        clip.fitInto(canvas.width, canvas.height);
    }

https://codepen.io/EiseiKashi/pen/aGjbWK

В случае каких-либо сомнений, пожалуйста, дайте мне знать!

0 голосов
/ 13 мая 2018

Эти два утверждения противоречивы.

Ширина и высота холста должны быть точно такими же, как ширина и высота загружаемого изображения.

Сам холст должен сохранять своиРазмеры и не должны быть повернуты, только изображение в нем должно быть повернуто.

Увеличьте размер вашего холста.Если вы повернете изображение на 45 градусов, вам понадобится больший холст.

Пока вы устанавливаете размер холста равным размеру изображения.Однако вращение изображения не приводит к повороту холста, причина, по которой края обрезаются.

Вот холст (синего цвета) с изображением (желтого цвета) точно такого же размера, но нарисованным сУгол 45 градусов.Края изображения, которые торчат, не прорисовываются ... потому что их нет на холсте.

enter image description here

Увеличьте размер холста докомпенсировать поворот изображения.Я бы порекомендовал рассчитать длину диагонали вашего изображения и установить его как ширину и высоту вашего холста, таким образом, независимо от того, как вы его поворачиваете, он подойдет.

Примерно так:

  let diagonalLength = Math.sqrt(
    Math.pow(preview.width,2)+Math.pow(preview.height,2)    
  );
  canvas.width  = diagonalLength;
  canvas.height = diagonalLength;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...