如何有效计算缩放比例?

2023-12-31

我有一个包含在框中的可拖动图像。您可以放大和缩小框中的图像,这将使图像变大或变小,但框大小保持不变。该框的高度和宽度将随着浏览器大小的调整而变化。图像的顶部和左侧值将在拖动时发生变化。

我试图将框在图像中居中的任何点保留在中心。有点像 Google 地图上的缩放功能或 Mac OS X 上的缩放功能。

我现在正在做的是计算框的中心(x = w/2,y = h/2),然后使用图像的顶部和左侧值来计算图像在框中心的位置盒子。 (x -= 左,y -= 顶部)。

然后,我通过放大或缩小图像来缩放图像,并使用比例变化来调整坐标(x = (x * (old_width/new_width), y = (y * (old_height/new_height)))。

然后,我重新定位图像,使其中心与缩放前相同,方法是获取当前居中的坐标(随调整大小而变化),并将旧中心值和新值之间的差异添加到顶部和左侧值(new_left = post_zoom_left + (old_center_x - new_center_x), new_top = post_zoom_top + (old_center_y - new_center_y)。

这对于放大来说效果很好,但是缩小似乎有点不对劲。

有什么建议么?

我的代码如下:

app.Puzzle_Viewer.prototype.set_view_dimensions = function () {

  var width, height, new_width, new_height, coordinates, x_scale,
    y_scale;

  coordinates = this.get_center_position();
  width = +this.container.width();
  height = +this.container.height();
  //code to figure out new width and height
  //snip ...
  x_scale = width/new_width;
  y_scale = height/new_height;
  coordinates.x = Math.round(coordinates.x * x_scale);
  coordinates.y = Math.round(coordinates.y * y_scale);
  //resize image to new_width & new_height
  this.center_on_position(coordinates);
};

app.Puzzle_Viewer.prototype.get_center_position = function () {

  var top, left, bottom, right, x, y, container;

  right = +this.node.width();
  bottom = +this.node.height();
  x = Math.round(right/2);
  y = Math.round(bottom/2);
  container = this.container.get(0);
  left = container.style.left;
  top = container.style.top;
  left = left ? parseInt(left, 10) : 0;
  top  = top ? parseInt(top, 10) : 0;
  x -= left;
  y -= top;
  return {x: x, y: y, left: left, top: top};
};

app.Puzzle_Viewer.prototype.center_on_position = function (coordinates) {

  var current_center, x, y, container;

  current_center = this.get_center_position();
  x = current_center.left + coordinates.x - current_center.x;
  y = current_center.top + coordinates.y - current_center.y;
  container = this.container.get(0);
  container.style.left = x + "px";
  container.style.top = y + "px";
};

[工作演示 http://jsbin.com/ejogi4/15]

Data

  • 调整大小:R
  • 画布的尺寸:Cw, Ch
  • 调整图像大小:Iw, Ih
  • 调整图像位置大小:Ix, Iy
  • 单击画布上的位置:Pcx, Pcy
  • 单击原图上的位置:Pox, Poy
  • 单击已调整大小的图像上的位置:Prx, Pry

Method

  1. 单击画布上的事件位置 -> 图像上的位置:Pox = Pcx - Ix, Poy = Pcy - Iy
  2. 图像上的位置 -> 调整大小的图像上的位置:Prx = Pox * R, Pry = Poy * R
  3. top = (Ch / 2) - Pry, left = (Cw / 2) - Prx
  4. ctx.drawImage(img, left, top, img.width, img.height)

执行

// resize image
I.w *= R;
I.h *= R;

// canvas pos -> image pos
Po.x = Pc.x - I.left;
Po.y = Pc.y - I.top;

// old img pos -> resized img pos
Pr.x = Po.x * R;
Pr.y = Po.y * R;

// center the point
I.left = (C.w / 2) - Pr.x;
I.top  = (C.h / 2) - Pr.y;

// draw image
ctx.drawImage(img, I.left, I.top, I.w, I.h);

这是一个general适用于放大或缩小的公式,并且可以将任何点作为新的中心。为了做到这一点specific对于你的问题:

  • Pcx = Cw / 2, Pcy = Ch / 2(始终使用中心)
  • R < 1用于缩小,以及R > 1用于放大
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何有效计算缩放比例? 的相关文章

  • jQuery 的 css() 在应用于滚动事件时滞后

    我正在尝试实现一个简单的 固定标题 表 我知道这在理论上只能用 CSS 来完成 但是当涉及到 OSX Lion 及其消失的滚动条时 它效果不佳 所以我用 jQuery 来做 方法很简单 只有1 5行代码 inbox scroll funct
  • 从未定义解构时避免错误

    可以说我有这个代码 const x y point Babel 会将其变成 var point point x point x y point y 这很好 但是如果点未定义怎么办 现在我得到一个错误 Cannot read property
  • jquery 通过 div 选择复选框

    我想知道 jQuery 中是否有一种方法可以在有人单击整个 div 层时选中 取消选中复选框 本质上就像有一个巨大的选择区域 有任何想法吗 这是一个例子 我试图使复选框周围可单击以切换单个复选框 几乎如此 fieldset div div
  • 简单的 jQuery 帖子无法在 Internet Explorer 9 上运行(访问被拒绝)

    我使用 JQuery 和 PHP 编写了一个验证器 该验证器适用于除 Internet Explorer 9 之外的所有浏览器 我收到错误消息 SCRIPT5 访问被拒绝 jQuery 代码 contact send click funct
  • 如何在 Bootstrap 3 中制作进度条动画?

    我正在尝试为 Bootstrap 进度条设置动画 但我不知道该怎么做 我得到了宽度的值但是console log bar width 返回宽度px但不是 如内联所示style width 90 我用代码重新创建了一个 bootply Boo
  • Bing.com 如何创建放大的缩略图?

    当我使用 Bing com 搜索图像时 我发现它们的图像经过精心裁剪和排序 当您将鼠标放在图像上时 会弹出另一个窗口 其中显示放大的图像 我想在我的程序中做同样的事情 我检查了他们页面的源代码 他们正在使用 javascript 但我仍然不
  • 提交前验证表单(比检查空字段更复杂)

    我有一个包含时间输入的表单 具体来说 开放时间和结束时间 当按下提交按钮时 它会转到一个 php 页面 其中这些输入将添加到数据库中 在允许提交表单之前我想检查一些事情 例如 我想确保开始时间早于 小于 结束时间 这是表格 Opens
  • 使用 jquery 和 php 测试表单输入是否为 1 或 2 位整数

    我有一个表单 其中有五个字段全部设置为 maxlength 2 基本上 我希望唯一可以输入的值是一位或两位整数 因为在将值存储在数据库中之前对这些字段执行计算 是否有任何 jquery 不允许用户输入不是整数的值 另外 用 jquery 和
  • jQuery Blur() 在 Chrome 上不起作用

    我在 MacOSX 上运行这个http jsfiddle net q84wv http jsfiddle net q84wv on Chrome最新版本 它不会工作 在 Firefox 上运行时它工作得很好 有什么线索吗 假设您想要aler
  • 引入 V8 后,Google Apps 脚本无法为其他用户完全执行

    我编写了一个脚本 得到了这里好心人的大力帮助 该脚本使用 Google Sheets 脚本复制 Google Drive 上的文件夹 和内容 它运行了很长一段时间 但后来我启用了 V8 引擎 现在已禁用 问题是 它仍然适用于我 也许还有其他
  • 专用网络:web3.eth.getAccounts() 始终发送空数组

    我正在运行一个私人以太坊网络 我确实用https aws amazon com blockchain templates 整个设置已经完成 AWS 上的设置看起来正确 现在 我正在尝试创建帐户并检索所有这些帐户 为此 我使用以下方法 Web
  • setInterval 内的返回值

    我想在 setInterval 内返回一个值 我只想以一定的时间间隔执行一些操作 这就是我尝试过的 function git limit var i 0 var git setInterval function console log i
  • Web SQL 数据库 + Javascript 循环

    我正在尝试解决这个问题 但我自己似乎无法解决 我正在使用 Web SQL DB 但无法让循环正常使用它 I use for var i 0 i lt numberofArticles 1 i db transaction function
  • 使用 JavaScript 的计时器

    我想使用java脚本实现计时器 我想随着间隔的变化而减少计时器 Example假设我的计时器从 500 开始 我想要根据级别减少计时器 例如1 一级定时器应减1 且递减速度应较慢 2 2级定时器应递减2 递减速度应为中等3 3级定时器应减3
  • Postman - 如何计算 JSON 响应中特定对象的出现次数

    我是 JSON 和 Postman 的新手 我相信我正在尝试做一些非常简单的事情 我创建了一个 GET 请求 它将获得如下所示的 JSON 响应 在下面的例子中我想得到count响应中所有 IsArchived 属性 这些属性的数量因响应而
  • Meteor.js 登录事件

    因此 我对 Meteor 框架和 JavaScript 总体来说还很陌生 但我正在使用该框架开发一个小项目 以尝试让自己达到标准 基本上我正在开发一个微博客网站 目前 用户可以通过多种服务登录 fb google 等 我通过插入所需 url
  • RTCDataChannel发送方法不发送数据

    我的 RTCDataChannel 遇到一个奇怪的问题 我正在对 WebRTC 进行一些研究 并且已经可以进行 WebRTC 音频 视频聊天 现在我想使用 RTCDataChannel 添加文本聊天和文件共享 我已经像这样创建了 RTCDa
  • 使用Promise而不拒绝它会导致内存泄漏吗? [复制]

    这个问题在这里已经有答案了 代码如下 function test value return new Promise function fulfill reject try fulfill true catch e throw e 我担心的是
  • 使用 React React-router 登录后重定向到主页,并且 usenavigate 不起作用?

    我希望用户在成功登录后重定向到主页 我将用户登录的 api 请求的数据存储在一个名为 currentUser 的变量中 因此如果 currentUser 为 true 它应该重定向到主页 这就是我处理登录请求的方式 export const
  • Serviceworker Bug event.respondWith

    我的 serviceworker 的逻辑是 当发生获取事件时 它首先获取包含一些布尔值 而不是 event request url 的端点 并根据我正在调用的值检查该值event respondWith 对于当前的获取事件 我正在提供来自缓

随机推荐

  • Jupyter Notebook 和之前的输出

    有什么方法可以在不重新运行程序的情况下查看以前的输出吗 例如 我让机器学习算法过夜 早上我就得到了结果 但是 由于某种原因 当我在原始代码上按 Enter 时 它再次开始运行 原始输出消失了 输出存在于特定的上下文中 即单元 并且只要内核仍
  • 什么事件捕获 DataGridViewCell 中组合框中的值更改?

    我想在 a 中的值发生更改时处理该事件ComboBox in a DataGridView cell 有的是CellValueChanged事件 但直到我单击事件内的其他位置后 该事件才会触发DataGridView 一个简单的ComboB
  • ggplot:同时通过“geom_rect”排列因子顺序并突出显示区域

    首先 指定分类变量顺序的方法ggplot是重新排序它的级别data frame 其次 要在我们可以使用的任何绘图上突出显示一个区域geom rect 这里需要注意的是 不要将数据传递给geom rect 否则它不允许我们设置alpha 因此
  • 在 Haskell 中操作元组

    我是 Haskell 的新手 我有一个关于元组的问题 难道就没有遍历元组的方法吗 我知道使用列表进行遍历非常容易 但是如果输入作为元组给出 是否没有办法像使用列表一样检查整个元组 如果不是这种情况 是否可以将元组中的值提取到列表中并以这种方
  • 全屏纹理 iPhone OpenGL ES

    我知道 iPhone 上的 OpenGL 纹理需要是 2 的幂 OpenGL 2 0 也是如此吗 如果我有一个尺寸为 320 x 480 的图像并且想要将其全屏绘制 是否有任何可能的方法可以使用 OpenGL 来完成此操作 Thanks N
  • 如何使用 async/await 在 Node.js 中异步创建ReadStream

    我在使用时遇到困难fs creadReadStream异步处理我的 csv 文件 async function processData row perform some asynchronous function await someAsy
  • 二分查找条件中何时使用“=”?

    我对何时使用的场景感到很困惑 在二分查找中 例如 这是我从 wiki 中找到的 其中使用 while imin lt imax int binary search int A int key int imin int imax contin
  • ios 设置包中的简单标题输出

    我只想在设置文件中输出我的 ios 应用程序的版本号 我知道我必须将设置文件添加到应用程序文件夹中 当我构建并运行时 我可以看到标准设置包附带的 4 个设置 为了获得一个简单的只读字符串 我将第二个值更改为以下 在代码 didFinishL
  • 检查一个列表是否包含另一个列表中的元素

    我有两个列表 其中包含不同的对象 List
  • 如何使用具有不同对象的“repeating:count:”来初始化数组? [复制]

    这个问题在这里已经有答案了 令人惊讶的是 下面的代码打印SAME而初始化程序应该调用Z 每次构造函数 如何使用此方法与不同的实例初始化数组Z import Foundation class Z var i Int 0 var z Z Z r
  • 英特尔 XDK:将您的移动应用连接到数据库

    我目前正在开发一个应用程序 如果我没有数据库 构建后的应用程序将会很重 如何将应用程序连接到本地或远程数据库 提前致谢 您可以使用以下方法之一来使用数据库 1 使用 HTML5 客户端数据库 HTML5 在本地客户端计算机上提供四种不同类型
  • 如何在交互式会话中重置下划线? [复制]

    这个问题在这里已经有答案了 我已经覆盖了下划线变量 在Python交互式解释器中 如何在不重新启动解释器的情况下使下划线再次工作 del 一个全球性的 shadows https en wikipedia org wiki Variable
  • 如何在 PHP 中使用 SerializeArray 值?

    我从表单中获得了调整大小 resize resize form serializeArray 我把调整大小放在隐藏中并将其发送到php页面 如何在php中获取调整大小值
  • React-Bootstrap / React-Router-Bootstrap 中导航栏品牌的最佳实践

    存在关于锚标记的问题反应引导 and 反应路由器 我很好奇其他人是如何处理这种情况的 可以只留下带有 href 的锚标记 例如 a href Site Title a 并避免使用IndexLinkContainer 还有使用MenuItem
  • 将错误消息设置为英语不起作用

    由于某种原因 我无法更改 PostgreSQL 错误消息的语言 我尝试在脚本内设置语言以在第一行创建架构 SET lc messages TO en US UTF 8 我也做了this https stackoverflow com que
  • 序列化修改记录时,belongsTo 承诺未解决

    好的 必填信息 DEBUG DEBUG Ember 1 3 1 DEBUG Ember Data 1 0 0 beta 7 f87cba88 DEBUG Handlebars 1 0 0 DEBUG jQuery 1 10 2 DEBUG
  • SSH.NET SFTP 递归获取目录和文件列表

    我正在使用 Renci SshNet 库通过 SFTP 递归获取文件和目录列表 我可以连接 SFTP 站点 但我不确定如何在 C 中递归获取目录和文件列表 我还没有找到任何有用的例子 有人尝试过这个吗 如果是这样 您可以发布一些有关如何递归
  • 将 stdout 和 stderr 重定向到 syslog

    在一个程序中 我希望将所有 printfs 写入系统日志 我将所有 printf 替换为 syslog 因此我想到将 stdout 和 stderr 重定向到 syslog 为此我尝试了以下代码 int main FILE fl fl po
  • Jquery - 使用两者时区分同一输入上的“点击”和“焦点”

    如果单击输入 我试图在输入上触发事件or如果输入成为焦点 我遇到的问题是阻止事件在单击时触发两次 因为显然 单击输入也会使其成为焦点 我在 jfiddle 上放了一个非常宽松的版本来向您展示我的意思 代码如下 HTML
  • 如何有效计算缩放比例?

    我有一个包含在框中的可拖动图像 您可以放大和缩小框中的图像 这将使图像变大或变小 但框大小保持不变 该框的高度和宽度将随着浏览器大小的调整而变化 图像的顶部和左侧值将在拖动时发生变化 我试图将框在图像中居中的任何点保留在中心 有点像 Goo