【发布时间】:2020-05-06 07:07:21
【问题描述】:
我正在构建一个文档查看器,文档的每一页都变成了一张图片,所有页面都在一个 html 画布上一个接一个地组合在一起。
我正在使用 FabricJS 用图像填充画布。 当我在画布内缩放图像时,它们会完美地放大和缩小,但画布本身的大小保持不变。
我希望改变画布大小,以便在需要时隐藏和显示滚动条。
这是构建和填充画布的代码:
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);
似乎可以完成这项工作,但我找不到更改宽度的公式。 不管我怎么尝试当我在几次点击后缩小页面时,由于画布宽度减小变化太大,页面开始被“剪切”(主要在右侧)。
我想我正在寻找的是一种了解画布内实际绘制图像的高度和宽度的方法。
我尝试使用 getImageData 方法和 toDataUrl 方法来获取它,但它们对我没有好处。
感谢您的帮助
更新额外信息:
- zoomToPoint - 根据所有方向的中心点对画布数据进行缩放。在我的代码中,我将 middleY 设置为零,将 middleX 设置为画布容器大小的一半,因此缩放将围绕该点调整数据大小,而不会导致图像移动的效果。
- 是的,我希望画布能够根据缩放比例进行缩放,以便用户能够在需要时滚动,或者在不需要时隐藏滚动条。
- 是的,画布的大小正确(+/- 2-3 像素)并且没有进行四舍五入。
【问题讨论】:
-
放大和缩小的比例是如何计算的?
-
@Serenity 很久以前的广告了,我真的不记得是怎么解决的了——从那以后我搬了一家公司,所以我也没有最终的解决方案。
标签: javascript html canvas html5-canvas fabricjs