Я создаю средство просмотра документов, и каждая страница документа превращается в изображение, и все они объединяются одна за другой на html холсте.
Я использую Fabri c JS для заполнения холста изображениями. Когда я масштабирую изображения внутри холста, они отлично увеличивают и уменьшают масштаб, но сам холст остается того же размера.
Я хочу, чтобы размер холста изменялся, поэтому полосы прокрутки будут скрываться и отображаться при необходимости.
Вот код для построения и заполнения холста:
buildCanvas: function (images, length, maximumWidth, totalHeight) {
var height = 10;
var canvasContainer = document.getElementById("canvasContainer");
var c = document.createElement("canvas");
c.width = canvasContainer.offsetWidth - 20;
c.height = totalHeight;
engine.canvasObject = new fabric.Canvas(c);
for (var index = 0; index < length; index++) {
var imgInstance = new fabric.Image(images[index], {
left: ((canvasContainer.offsetWidth / 2) - (maximumWidth / 2)),
top: height
});
var ratio = 1;
if (images[index].width > engine.maxWidth) {
ratio = engine.maxWidth / images[index].width;
imgInstance.scale(ratio);
maximumWidth = engine.maxWidth;
}
engine.canvasObject.add(imgInstance);
height += (images[index].height * ratio) + 15;
}
canvasContainer.appendChild(c);
},
, а вот код, который я использую для увеличения и уменьшения:
zoom: function (ratio) {
var canvasContainer = document.getElementById("canvasContainer");
var middleX = canvasContainer.offsetWidth / 2;
var middleY = 0;
var zoom = engine.canvasObject.getZoom();
engine.canvasObject.setHeight(engine.canvasObject.getHeight() * ratio);
//engine.canvasObject.setWidth(engine.canvasObject.getWidth() * (zoom + (ratio - 1)));
engine.canvasObject.zoomToPoint({ x: middleX, y: middleY }, zoom + (ratio - 1));
}
Изменение Высота холста, как написано в этой строке:
engine.canvasObject.setHeight(engine.canvasObject.getHeight() * ratio);
, кажется, делает эту работу, но мне не удалось найти формулу для изменения ширины. Неважно, что я пытался. Когда я уменьшал изображение после нескольких щелчков, страница начинает «обрезаться» (в основном с правой стороны) из-за слишком большого изменения ширины холста.
Я думаю, что я ищу for - это способ узнать высоту и ширину фактического нарисованного изображения внутри холста.
Я пытался получить его, используя метод getImageData, а также метод toDataUrl, но они мне не подходят.
Спасибо за любую помощь
Обновление с дополнительной информацией:
- zoomToPoint - выполняет масштабирование данных холста на основе центральной точки по всем направлениям. В моем коде я установил middleY равным нулю, а middleX равным половине размера контейнера Canvas, поэтому масштабирование изменит размер данных вокруг этой точки, не вызывая эффекта перемещения изображения.
- Да, я sh холст, который нужно масштабировать в соответствии с масштабом, чтобы пользователь мог прокручивать при необходимости, или полосы прокрутки будут скрыты, когда в этом нет необходимости.
- Да, холст имеет правильный размер ( +/- 2-3 пикселя), округлений нет.