Paper.js子主机选择错误区域
Paper.js Subraster Selecting Wrong Area
我在Paper.js项目中工作,我们主要在做图像编辑。有一个大光栅。我尝试使用getSubRaster
方法复制图像的一部分(光栅),然后用户可以在其中移动。
加载要编辑的光栅后,调用selectArea
来注册这些侦听器:
var selectArea = function() {
if(paper.project != null) {
var startDragPoint;
paper.project.layers[0].on('mousedown', function(event) { // TODO should be layer 0 in long run? // Capture start of drag selection
if(event.event.ctrlKey && event.event.altKey) {
startDragPoint = new paper.Point(event.point.x + imageWidth/2, (event.point.y + imageHeight/2));
//topLeftPointOfSelectionRectangleCanvasCoordinates = new paper.Point(event.point.x, event.point.y);
}
});
paper.project.layers[0].on('mouseup', function(event) { // TODO should be layer 0 in long run? // Capture end of drag selection
if(event.event.ctrlKey && event.event.altKey) {
var endDragPoint = new paper.Point(event.point.x + imageWidth/2, event.point.y + imageHeight/2);
// Don't know which corner user started dragging from, aggregate the data we have into the leftmost and topmost points for constructing a rectangle
var leftmostX;
if(startDragPoint.x < endDragPoint.x) {
leftmostX = startDragPoint.x;
} else {
leftmostX = endDragPoint.x;
}
var width = Math.abs(startDragPoint.x - endDragPoint.x);
var topmostY;
if(startDragPoint.y < endDragPoint.y) {
topmostY = startDragPoint.y;
} else {
topmostY = endDragPoint.y;
}
var height = Math.abs(startDragPoint.y - endDragPoint.y);
var boundingRectangle = new paper.Rectangle(leftmostX, topmostY, width, height);
console.log(boundingRectangle);
console.log(paper.view.center);
var selectedArea = raster.getSubRaster(boundingRectangle);
var selectedAreaAsDataUrl = selectedArea.toDataURL();
var subImage = new Image(width, height);
subImage.src = selectedAreaAsDataUrl;
subImage.onload = function(event) {
var subRaster = new paper.Raster(subImage);
// Make movable
subRaster.onMouseEnter = movableEvents.showSelected;
subRaster.onMouseDrag = movableEvents.dragItem;
subRaster.onMouseLeave = movableEvents.hideSelected;
};
}
});
}
};
这些方法在正确的时间触发,并且选择框的大小似乎正确。它确实为我呈现了一个新的光栅,我可以四处移动,但光栅的内容不是我选择的。它们接近我选择的内容,但不是我选择的。选择不同的领域似乎不会产生不同的结果。生成的子列表的内容似乎总是在实际选择的右侧。
请注意,当我为边界选择矩形构建点时,我会进行一些平移。这是因为坐标系的差异。我绘制矩形选择的坐标系在图像的中心有(0,0),x向右增加,y向下增加。但对于getSubRaster
,我们需要根据文档提供像素坐标,从图像左上角的(0,0)开始,向右和向下增加。因此,当我构建点时,我通过添加imageWidth/2
和imageHeight/2`将点转换为光栅/像素坐标。
那么,为什么这个代码选择了错误的区域?提前谢谢。
编辑:
不幸的是,我无法分享我正在使用的图像,因为它是敏感的公司数据。但这里有一些元数据:
- 图像宽度:4250像素
- 图像高度:5500像素
- 画布宽度:591像素
- 画布高度:766像素
我的画布大小因浏览器窗口的大小而异,但这些都是我一直在测试的参数。我不认为画布尺寸特别相关,因为我做的一切都是基于图像像素的。据我所知,当我拍摄event.point.x
和event.point.y
时,这些都是图像缩放的坐标,但来自不同的原点——中心而不是左上角。不幸的是,我找不到任何关于这方面的文档观察此草图中的坐标是如何工作的
我也一直在做一个草图来说明这个问题。若要使用它,请按住Ctrl+Alt并在图像上拖动一个框。这应该会触发一些日志数据并尝试获取子主机,但我收到了一个操作不安全的错误,我认为这是因为图像请求标头中的安全设置。使用基64字符串而不是URL不会产生安全错误,但没有任何作用。在草图中使用该字符串会产生一个超长的URL,我无法粘贴到这里。但要获得它,您可以下载图像(或任何图像)并在此处进行转换,然后将其作为img.src
。
问题是鼠标事件都返回相对于画布的0, 0
的点。并且getSubRaster
期望坐标相对于它从中提取的光栅项的0, 0
。
调整需要为eventpoint - raster.bounds.topLeft
。它实际上与图像的宽度或高度无关。您希望调整事件点,使它们相对于光栅的0, 0
,而0, 0
就是raster.bounds.topLeft
。
将事件点调整为导致事件点偏移不正确的图像大小的1/2时。对于Mona Lisa示例,光栅大小(图像大小)为w: 320, h: 491
;除以二它们是CCD_ 16。但图像的bounds.topLeft
(当我绘制草图时)是x: 252.5, y: 155.5
。
这是一个草图,显示它的工作。我添加了一个小的红色方块来突出显示选定的区域,这样在完成时更容易进行比较。我也没有包括toDataURL逻辑,因为它会产生您提到的安全问题。
给你:绘制
以下是我放入HTML文件中的代码;我注意到我放在一起的草图链接到以前版本的代码,但该代码并不完全有效。
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Rasters</title>
<script src="./vendor/jquery-2.1.3.js"></script>
<script src="./vendor/paper-0.9.25.js"></script>
</head>
<body>
<main>
<h3>Raster Bug</h3>
<div>
<canvas id="canvas"></canvas>
</div>
<div id="position">
</div>
</main>
<script>
// initialization code
$(function() {
// setup paper
$("#canvas").attr({width: 600, height: 600});
var canvas = document.getElementById("canvas");
paper.setup(canvas);
// show a border to make range of canvas clear
var border = new paper.Path.Rectangle({
rectangle: {point: [0, 0], size: paper.view.size},
strokeColor: 'black',
strokeWidth: 2
});
var tool = new paper.Tool();
// setup mouse position tracking
tool.on('mousemove', function(e) {
$("#position").text("mouse: " + e.point);
});
// load the image from a dataURL to avoid CORS issues
var raster = new paper.Raster(dataURL);
raster.position = paper.view.center;
var lt = raster.bounds.topLeft;
var startDrag, endDrag;
console.log('rb', raster.bounds);
console.log('lt', lt);
// setup mouse handling
tool.on('mousedown', function(e) {
startDrag = new paper.Point(e.point);
console.log('sd', startDrag);
});
tool.on('mousedrag', function(e) {
var show = new paper.Path.Rectangle({
from: startDrag,
to: e.point,
strokeColor: 'red',
strokeWidth: 1
});
show.removeOn({
drag: true,
up: true
});
});
tool.on('mouseup', function(e) {
endDrag = new paper.Point(e.point);
console.log('ed', endDrag);
var bounds = new paper.Rectangle({
from: startDrag.subtract(lt),
to: endDrag.subtract(lt)
});
console.log('bounds', bounds);
var sub = raster.getSubRaster(bounds);
sub.bringToFront();
var subData = sub.toDataURL();
sub.remove();
var subRaster = new paper.Raster(subData);
subRaster.position = paper.view.center;
});
});
var dataURL = ; // insert data or real URL here
</script>
</body>
</html>
- 使用Google Analytics API的区域图-未采集类型错误无法读取'库'的未定义
- Ajax文本区域保存错误
- Jcrop&画布:裁剪区域的大小很奇怪;500内部服务器错误
- 在文本区域检查电子邮件数据时出现奇怪的jquery错误
- 高图表:显示错误值的堆积区域工具提示
- 如果文本区域为空,如何在按回车键时显示错误
- 未捕获的类型错误: 无法读取未定义的属性“区域”
- 文本区域返回错误的值
- 我无法在 JavaScript 中获取要打印到文本区域的属性值,我收到一个错误:未捕获的类型错误:无法读取 null 的
- 将错误的哈希字符串发送到文本区域中的 sha256 所有行
- 删除或重复的非单词字符,如HTML文本区域中的换行符,这些字符会导致modsecurity中的错误
- HTML文本区域拼写检查:如何判断用户是否犯了拼写错误
- 输入区域中出现PHP错误的新行
- 试图使用javascript将文本区域中的链接替换为超链接会导致数组错误
- Paper.js子主机选择错误区域
- 文本区域标签高亮显示应用于第一行之后的错误位置
- 时间文本区域值错误-无法解决
- D3从直线到区域过渡开始时填充颜色错误
- HTML-如何在javascript中对文本区域的空值输入进行错误检查
- 设置通过Ajax更新文本区域的selectionStart属性导致IE中出现800a025e错误