【发布时间】:2016-02-20 12:03:15
【问题描述】:
我正在使用 Paper.js 制作一个处理图像队列的图像编辑器。这些图像来自上传到服务器并转换为图像的 PDF。根据question 中的建议,我将每个图像加载到自己的图层中。
// Load images of pdf, each into its own layer
var loadPdf = function(pdfAsImages) {
toolsSetup();
// Loop through images for pdf
pdfToLayerMap[pdfAsImages.id] = [];
for(var i = 0; i < pdfAsImages.images.length; i++) {
var layerForImage = new paper.Layer();
layerForImage.visible = false;
pdfToLayerMap[pdfAsImages.id][i] = {
layerIndex: paper.project.activeLayer.index,
imageHeight: pdfAsImages.images[i].height
};
var imageDataUrl = 'data:image/png;base64,' + pdfAsImages.images[i].imageData;
var raster = new paper.Raster(imageDataUrl, new paper.Point(canvas.width / 2, canvas.height / 2));
layerForImage.addChild(raster);
selectedItemsByLayer[layerForImage.index] = new paper.Group();
registerLayerEvents(layerForImage);
}
};
var setActive = function(pdfIndex, imageIndex) {
var imageHeight = pdfToLayerMap[pdfIndex][imageIndex].imageHeight;
paper.project.activeLayer.visible = false;
var layerToActivate = pdfToLayerMap[pdfIndex][imageIndex].layerIndex;
paper.project.layers[layerToActivate].activate();
paper.project.layers[layerToActivate].visible = true;
fitToPage(imageHeight);
};
loadPdf 每次从服务器接收到图像时都会被调用。这为 pdf 中每个页面的每个图像添加了一个新层。问题是,当创建一个新层时,它被设置为活动层。因此,当从服务器加载图像时,我们希望能够对已加载的图像执行编辑。但是随着图像加载,活动层与我们当前正在编辑的任何已加载图像不同步。因此,如果我尝试添加文本,例如,它会将其添加到错误的图像中,因为它会将其添加到活动层,即错误的层。不知何故,我们需要将活动层与我们当前正在编辑的图像保持一致。 (这可以通过单独的 Paper 上下文来完成吗?)
由于我们事先不知道图像的数量(我们知道 PDF 的数量,但不知道每个有多少页),我们不能这样做,预先初始化所有层:
var initializeLayers = function(numberOfLayers) {
for(var i = 0; i < numberOfLayers; i++) {
var layerForImage = new paper.Layer();
layerForImage.visible = false;
selectedItemsByLayer[i] = new paper.Group();
}
paper.project.layers[0].activate();
};
那么有没有办法阻止 Paper.js 在创建时将新图层设置为活动状态?还是有其他方法可以解决这个问题?
【问题讨论】:
-
也许您可以考虑向 paperjs 团队提出问题?在
new paper.Layer上更改图层确实看起来像side-effect 代码气味 -
Scott - 我有一个很长的答案,提供了另一种方法来做到这一点,但我最初错过了,是的,创建一个层而不将其插入项目可能使用 @987654327 的对象形式@
标签: javascript image asynchronous layer paperjs