如何正确测量网页上的打印尺寸和距离?

3
我正在尝试构建一个T恤印刷网站,目前遇到的问题是如何正确测量/计算印刷在x/y轴上的位置和印刷本身的大小。
您可以通过以下方式了解我的意思:
1. 访问spreadshirt 2. 选择任何一种印花 3. 尝试移动/调整印花 4. 不论屏幕/字体大小,测量结果都将相同
我不确定计算是如何进行的,但我想也许我可以获取设备dpi,然后根据结果将像素转换为英寸。但遗憾的是,在许多情况下这样做无法给出正确的测量结果。
1个回答

0

你不需要任何这类的 dpi

因为你有一个固定且已知大小和位置的盒子(在这种情况下是 T 恤)。

当用户将元素移动到盒子内时,你可以计算元素相对于盒子的位置和大小。

你所需要做的就是像这样:

scale = box.width_in_inches / box.width_in_pixels
el.x_in_inches      = (el.x_in_pixels - box.x_in_pixels)*scale
el.y_in_inches      = (el.y_in_pixels - box.y_in_pixels)*scale
el.width_in_inches  = (el.width_in_pixels              )*scale
el.height_in_inches = (el.height_in_pixels             )*scale

box.width_in_inches用户选择不同尺码的T恤时会改变。
box.width_in_pixels当用户缩放页面时会改变。
但所有*_in_pixels值都会相应地改变。


更新: 回应您的评论:

也许你的代码中得到了错误的测量结果,因为它们从一开始就是错误的:T恤宽度和高度的比例。
以英寸为单位:22/30.5 = 0.72...
以图片像素为单位:452/548 = 0.8248...(或者在我的浏览器页面上:1428.750/1732.190 = 0.8248...)
使用您设置的边界像素:(1428.750-160)/(1732.190-100) = 0.777...
所以我必须想办法解决它。我选择删除边界,这样徽标可以在T恤图片内自由移动和拉伸。并且决定T恤宽度应该是25.157...英寸,而不是22英寸。
然后,只是作为声音检查,我将徽标宽度设置为最大值,并将其移到顶部。现在是实验的时候了。预期结果应该与{ x:0, y:0, w: 25.157, h: 9.07 }相当接近。
使用以下函数:
// const shirt_w_in_inches = 30.5*(452/548) const shirt_h_in_inches = 30.5
function get_measurements() { const pixels_shirt = shirt.getBoundingClientRect() const pixels_logo = logo .getBoundingClientRect() const scale = shirt_h_in_inches / pixels_shirt.height const inches = { x: (pixels_logo.x - pixels_shirt.x)*scale, y: (pixels_logo.y - pixels_shirt.y)*scale, w: (pixels_logo.width )*scale, h: (pixels_logo.height )*scale, }
console.log("pixels_shirt", pixels_shirt) console.log("pixels_logo" , pixels_logo) console.log("inches" , inches)
return inches }
我认为它们相当合理。
我能找到的最坏情况是,当我设置500%缩放并刷新页面,然后将浏览器调整为初始窗口大小的25%(我无法将其设置得更小)时,最大误差约为T恤宽度的1%。在这种情况下,我得到以下测量结果:{x: 0.153..., y: 0.172..., w: 24.920..., h: 8.948...}
但是,如果我添加英寸宽度和英寸x,我将得到25.073-这给出了0.3%-这是我观察到的平均误差。
所以你可以问:“x和y怎么样?它们从来不是0!”很抱歉打破你的幻想,但看起来像是你正在使用的Moveable的问题。如果我使用此函数:
function set_full_size() { const pixels_shirt = shirt.getBoundingClientRect() const pixels_logo = shirt.getBoundingClientRect() logo.style.left = shirt.clientLeft + 'px' logo.style.top = shirt.clientTop + 'px' logo.style.width = shirt.clientWidth + 'px' logo.style.height = shirt.clientHeight*pixels_logo.height/pixels_logo.clientWidth + 'px' }
它不仅将x和y设置为零,而且宽度的误差更小。这可能是因为Moveable在徽标周围放置控件的原因。

能否请您添加一个例子? - ctf0
1
你提供的网站使用SVG,那你是用什么 - 我不知道。你的数据结构和字段名称 - 我也不知道。你如何从用户那里获取T恤尺寸 - 我同样不知道。我想你应该知道如何以像素为单位获取元素的尺寸。因此,我真的不明白已经提供的代码缺少了什么。但如果您在问题中更新一个代码示例,我就能够修复它。 - x00
抱歉回复晚了,这是一个演示关于盒子尺寸的信息,它的尺寸为 30.5英寸高 x 22英寸宽 - ctf0
抱歉,我现在身处无法连接到jsfiddle的地方 :). 而且我的VPN刚刚断了。你能把代码放到github上吗? - x00
没问题,这是gist - ctf0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接