Растровое изображение смещено от центра после масштабирования по размеру страницы в Paper.js

Я работаю над приложением Paper.js, которое помещает raster (изображение) в view. Затем он масштабируется, чтобы соответствовать изображению, чтобы все было видно одновременно. В основном это работает, но изображение смещается, например:

смещение

Когда это должно выглядеть примерно так:

введите здесь описание изображения

Вот код, который создает view, добавляет изображение и вызывает функцию масштабирования:

// Set up HTMLImage
var image = new Image(this.props.image.width, this.props.image.height);
image.src = 'data:image/png;base64,' + this.props.image.imageData;

//var canvas = React.findDOMNode(this.refs.canvas); // React 0.13 +
var canvas = this.refs.canvas.getDOMNode();

// Scale width based on scaled height; canvas height has been set to the height of the document (this.props.height)
var scalingFactor = canvas.height/image.height;
canvas.width = image.width * scalingFactor;

// Initialize Paper.js on the canvas
paper.setup(canvas);

// Add image to Paper.js canvas
var raster = new paper.Raster(image, new paper.Point(0,0));

// Fit image to page so whole thing is displayed
var delta = scalingFactor < 1 ? -1 : 1; // Arbitrary delta (for determining zoom in/out) based on scaling factor
var returnedValues = panAndZoom.changeZoom(paper.view.zoom, delta, paper.view.center, paper.view.center, scalingFactor);
paper.view.zoom = returnedValues[0];

А вот метод panAndZoom.changeZoom:

SimplePanAndZoom.prototype.changeZoom = function(oldZoom, delta, centerPoint, offsetPoint, zoomFactor) {
    var newZoom = oldZoom;
    if (delta < 0) {
        newZoom = oldZoom * zoomFactor;
    }
    if (delta > 0) {
        newZoom = oldZoom / zoomFactor;
    }

    var a = null;
    if(!centerPoint.equals(offsetPoint)) {
        var scalingFactor = oldZoom / newZoom;
        var difference = offsetPoint.subtract(centerPoint);
        a = offsetPoint.subtract(difference.multiply(scalingFactor)).subtract(centerPoint);
    }

    return [newZoom, a];
};

Любая идея, почему он масштабируется, чтобы соответствовать, но теряет центрирование?


person Scotty H    schedule 07.10.2015    source источник


Ответы (1)


TL;DR

Используйте любой, но не оба:

  • После увеличения:

      paper.view.setCenter(0,0);
    
  • При вставке изображения:

      var raster = new paper.Raster(image, new paper.Point(canvas.width/2, canvas.height/2));
    

Длинный ответ

В качестве отказа от ответственности я должен отметить, что я ничего не знаю о paper.js, и их документация выглядит ужасно. Этот ответ рождается из возни.

Я более или менее воспроизвел ваш код, и после некоторой переделки мне удалось решить проблему, используя это:

paper.view.zoom = returnedValues[0];
paper.view.setCenter(0,0);

Если вам интересно, почему я не указываю на документацию по setCenter, то это потому, что я не смог ее найти. Я обнаружил этот метод, проверив paper.view.center.

Хотя я не был удовлетворен, так как не мог понять, почему это сработает. Таким образом, я продолжал смотреть на ваш код и заметил это:

// Add image to Paper.js canvas
var raster = new paper.Raster(image, new paper.Point(0,0));

Документация для raster говорит нам следующее:

Растр

Создает новый элемент растра из переданного аргумента и помещает его в активный слой. Объект может быть изображением DOM, холстом или строкой, описывающей URL-адрес для загрузки изображения, или идентификатор элемента DOM, из которого нужно получить изображение (либо изображение DOM, либо холст).

Параметры:

источник: HTMLImageElement / HTMLCanvasElement / String — источник растра — необязательно

position: Point — центральная позиция, в которой размещается растровый элемент — необязательно

Насколько я понимаю, изображение вставляется на холст с центром в позиции 0,0, также известной как верхний левый угол. Затем размер содержимого холста изменяется, но в зависимости от его собственного центрального положения. Это приближает изображение к центру холста, но несоответствие все равно остается.

Установка центра на 0,0 просто синхронизирует центральные точки как изображения, так и холста.

Существует также альтернативный способ, заключающийся в том, чтобы вставить изображение в текущий центр холста, что кажется более правильным:

// Add image to Paper.js canvas
var raster = new paper.Raster(image, new paper.Point(canvas.width/2, canvas.height/2));

Вот элементарный JSFiddle для экспериментов.

person spenibus    schedule 13.10.2015