在缩放模式 Picturebox 中平移矩形位置会导致负 Y 坐标

2024-01-08

我正在使用以下类参考 -在缩放模式 Picturebox 中平移矩形位置 https://stackoverflow.com/questions/53800328/translate-rectangle-position-in-zoom-mode-picturebox将位图中的矩形选择转换为在 UI 中的图片框上绘制的框架控件。

public class ZoomFactor
{
    public ZoomFactor() { }

    public PointF TranslateZoomPosition(PointF coordinates, SizeF containerSize, SizeF imageSize)
    {
        PointF imageOrigin = TranslateCoordinatesOrigin(coordinates, containerSize, imageSize);
        float scaleFactor = GetScaleFactor(containerSize, imageSize);
        return new PointF(imageOrigin.X / scaleFactor, imageOrigin.Y / scaleFactor);
    }

    public RectangleF TranslateZoomSelection(RectangleF selectionRect, SizeF containerSize, SizeF imageSize)
    {
        PointF selectionTrueOrigin = TranslateZoomPosition(selectionRect.Location, containerSize, imageSize);
        float scaleFactor = GetScaleFactor(containerSize, imageSize);

        SizeF selectionTrueSize = new SizeF(selectionRect.Width / scaleFactor, selectionRect.Height / scaleFactor);
        return new RectangleF(selectionTrueOrigin, selectionTrueSize);
    }

    public RectangleF TranslateSelectionToZoomedSel(RectangleF selectionRect, SizeF containerSize, SizeF imageSize)
    {
        float scaleFactor = GetScaleFactor(containerSize, imageSize);
        RectangleF zoomedSelectionRect = new
            RectangleF(selectionRect.X * scaleFactor, selectionRect.Y * scaleFactor,
                       selectionRect.Width * scaleFactor, selectionRect.Height * scaleFactor);

        PointF imageScaledOrigin = GetImageScaledOrigin(containerSize, imageSize);
        zoomedSelectionRect.Location = new PointF(zoomedSelectionRect.Location.X + imageScaledOrigin.X,
                                                  zoomedSelectionRect.Location.Y + imageScaledOrigin.Y);
        return zoomedSelectionRect;
    }

    public PointF TranslateCoordinatesOrigin(PointF coordinates, SizeF containerSize, SizeF imageSize)
    {
        PointF imageOrigin = GetImageScaledOrigin(containerSize, imageSize);
        return new PointF(coordinates.X - imageOrigin.X, coordinates.Y - imageOrigin.Y);
    }

    public PointF GetImageScaledOrigin(SizeF containerSize, SizeF imageSize)
    {
        SizeF imageScaleSize = GetImageScaledSize(containerSize, imageSize);
        return new PointF((containerSize.Width - imageScaleSize.Width) / 2,
                          (containerSize.Height - imageScaleSize.Height) / 2);
    }

    public SizeF GetImageScaledSize(SizeF containerSize, SizeF imageSize)
    {
        float scaleFactor = GetScaleFactor(containerSize, imageSize);
        return new SizeF(imageSize.Width * scaleFactor, imageSize.Height * scaleFactor);

    }
    internal float GetScaleFactor(SizeF scaled, SizeF original)
    {
        return (original.Width > original.Height) ? (scaled.Width / original.Width)
                                                  : (scaled.Height / original.Height);
    }
}

// Using the Class
RectangleF BitmapRect = ZoomHelper.TranslateSelectionToZoomedSel(ResizedRect, new SizeF(pbox_preview.Width, pbox_preview.Height), bit.Size);

这对于大多数输入都适用,但是当提供以下输入时,返回的 Y 坐标为负并且缩放是错误的。

ResizedRect --> {X = 37 Y = 2 Width = 227 Height = 308} 

PictureBoxSize ---> SizeF(603,423)

imagesize --->  (311,310)

The returned rectangle is this 
{X = 71.73955 Y = -85.15273 Width = 440.131836 Height = 597.1833}

Y 坐标为负。


你知道:

  • 如何计算缩放后的图片框的缩放系数(比例)。
  • 如何获取缩放图片框中的图像偏移(左上角)。

然后在图像上有一个矩形(具有原始大小),这是计算矩形大小和缩放图片框上的位置的方法:

  1. 使用垂直和水平比例缩小矩形
  2. 使用缩放图片框的图像偏移来偏移结果。

以下是两种方法:

  • GetRectangeOnImage:将矩形放在缩放的图片框上,返回原始图像上的矩形
  • GetRectangeOnPictureBox:拥有原始图像上的矩形,它返回缩放图片框上的矩形。

Code:

public RectangleF GetRectangeOnImage(PictureBox p, Rectangle rectOnPictureBox)
{
    var method = typeof(PictureBox).GetMethod("ImageRectangleFromSizeMode",
        System.Reflection.BindingFlags.NonPublic | 
        System.Reflection.BindingFlags.Instance);
    var imageRect = (Rectangle)method.Invoke(p, new object[] { p.SizeMode });
    if (p.Image == null)
        return rectOnPictureBox;
    var cx = (float)p.Image.Width / (float)imageRect.Width;
    var cy = (float)p.Image.Height / (float)imageRect.Height;
    rectOnPictureBox.Offset(-imageRect.X, -imageRect.Y);
    return new RectangleF(rectOnPictureBox.X * cx, rectOnPictureBox.Y * cy,
        rectOnPictureBox.Width * cx, rectOnPictureBox.Height * cy);
}
public RectangleF GetRectangeOnPictureBox(PictureBox p, Rectangle rectOnImage)
{
    var method = typeof(PictureBox).GetMethod("ImageRectangleFromSizeMode",
        System.Reflection.BindingFlags.NonPublic | 
        System.Reflection.BindingFlags.Instance);
    var imageRect = (Rectangle)method.Invoke(p, new object[] { p.SizeMode });
    if (p.Image == null)
        return rectOnImage;
    var cx = (float)p.Image.Width / (float)imageRect.Width;
    var cy = (float)p.Image.Height / (float)imageRect.Height;
    var r2 = new RectangleF(rectOnImage.X / cx, rectOnImage.Y / cy,
        rectOnImage.Width / cx, rectOnImage.Height / cy);
    r2.Offset(imageRect.X, imageRect.Y);
    return r2;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在缩放模式 Picturebox 中平移矩形位置会导致负 Y 坐标 的相关文章

  • 从类外部调用某些异步方法时出现异常

    假设我有一个名为 x 和 y 的类 如下所示 class x public x p private async p await q private async p some logic is there 在 test aspx cs 文件中
  • 计算复杂数组的abs()值的最快方法

    我想计算 C 或 C 中复杂数组元素的绝对值 最简单的方法是 for int i 0 i lt N i b i cabs a i 但对于大向量来说 速度会很慢 有没有办法加快速度 例如使用并行化 语言可以是 C 或 C 鉴于所有循环迭代都是
  • Keyboard.Focus(item) 和 item.Focus() 有什么区别?

    在 WPF 中 有两种方法将焦点设置到元素 您可以调用输入元素的 Focus 方法 也可以使用输入元素作为参数调用 Keyboard Focus first way item Focus alternate way Keyboard Foc
  • 我的 WPF 应用程序未触发 MainWindow_Loaded

    我目前正在关注Pluralsight C Fundamentals Part 1并在Classes and Objects视频部分指导我在 Visual Studio 中创建一个新的 WPF 应用程序并填写代码 这导致以下结果 namesp
  • 修剪 UIImage 边框

    这是我想要修剪的图像的示例 我想去掉图像周围的边框 在本例中是顶部和底部的黑条 我在Github上找到了一个库 CKImageAdditions https github com cmkilger CKImageAdditions 但是它似
  • 函数指针上的未知类型 F TYPE

    include
  • 试图使用加密来混淆我的项目打破了它

    我试图尝试不同的混淆选项 为了做到这一点 我首先尝试了加密货币 以下是我遵循的步骤 打开加密向导并选择一些选项 选择我的解决方案文件 完成向导后 我看到有些 Dll 被很好地混淆了 但我的项目现在无法构建 我注意到的两件事是 我的文件夹中有
  • 从套接字读取 C HTTP

    我想知道如何判断是否已从套接字接收到所有数据 这是一个简单的网络代理 现在我正在处理请求部分 所以发送的内容应该以 r n r n 结尾 我不知道请求会持续多久 我在这里读过一些帖子 说我应该检查读取函数是否返回 0 但其他人说0只在客户端
  • 三种 System.Drawing 方法表现出缓慢的绘制或闪烁:解决方案?或其他选择?

    我正在通过 System Drawing 进行一些绘图 但遇到了一些问题 我将数据保存在队列中 并将该数据绘制 绘制 到三个图片框中 此方法填充图片框 然后滚动图形 所以不要在以前的绘图上绘制 并且逐渐看起来更混乱 我找到了两种绘制图表的解
  • 将授权标头添加到 Web 参考

    我正在尝试向客户端的网络服务发出请求 我不知道客户端的底层平台 我使用 添加 Web 引用 在 Visual Studio 2010 中使用了客户端的 WSDL 并生成了我的代理类 称为 ContactService 我现在需要将如下所示的
  • C 中的链表数组:初始化和插入?

    我需要创建一个链表数组 如图所示 这就是我到目前为止所做的 typedef struct Node int data struct Node next Node int main void Node link 5 for int q 0 q
  • 如何在asp.net core 6中注入IConfiguration

    web api 应用程序中不再有 Startup cs 我们以前可以注入IConfiguration进入那个Startup class public class Startup public Startup IConfiguration c
  • #define 内存地址声明

    这个 define 语句有什么作用 它用于定义内存地址 但我不明白 uint32 t 部分 define GPxDAT uint32 t 0x6FC0 通常用于访问映射到地址空间的硬件寄存器 或者一些特定的内存地址 硬件寄存器应定义为vol
  • 使用非字符串作为字符串(而不是自动使用 ToString)时如何显示错误?

    建议的重复确实是一个类似的问题 然而 答案只涵盖一种选择 禁用 ToString 本身 还有其他可能的解决方案 例如让 Visual Studio 警告我 或者不调用 ToString 仔细阅读那里的答案 他认为is调用 只是解释说没有办法
  • 如何组合||条件语句中的运算符[重复]

    这个问题在这里已经有答案了 代替 if foo 1 foo 5 foo 9 我喜欢将它们组合起来 类似于以下内容 这不起作用 if foo 1 5 9 那可能吗 不幸的是不是 你最好的选择是创建一个扩展方法 public static bo
  • 将多个 Blob 输入传递到 QueueTrigger Azure 函数的最佳方法

    问题 触发后 生成 3 个 XML 文件 完成后将它们通过 ftp 传输到站点 目前的方法 我有一个 HTTP 触发器 Azure 函数 运行时将构造 3 个 XML 文件并将它们保存到 Azure 存储 Blob 容器中 由于有多个输出
  • 在Framework 4.6项目中使用.net core DLL

    我已经在 net core 2 0 中构建了一个 DLL 现在我想在使用 net 4 6 1 框架的 WinForms 项目中使用它 我可以引用该 dll 但收到 System IO FileLoadException 表示找不到 Syst
  • 如何使用完全空的类型使 Activator.CreateInstance 运行速度减慢约 20 倍

    Given NET 程序集命名expression host NET 程序集命名CreateInstanceTest CreateInstanceTest 在其配置文件中启用 NetFx40 LegacySecurityPolicy exp
  • asp.net mvc GET 请求上的 formcollection 应该为空

    我正在发布一个简单的操作 public void Login FormCollection formCollection 即使查询字符串值很少 formcollection Count is 0 是靠行为吗 FormCollection 使
  • 如何使用 Ioc Unity 注入依赖属性

    我有以下课程 public interface IServiceA string MethodA1 public interface IServiceB string MethodB1 public class ServiceA IServ

随机推荐

  • 如何在flutter中定义自定义文本主题?

    如何制作自己的文字主题风格 我只找到这样的默认文本主题 但这还不够 textTheme TextTheme body1 TextStyle body2 TextStyle button TextStyle caption TextStyle
  • Python字典和集合内存分配

    I found 这个优秀的资源 https www safaribooksonline com library view high performance python 9781449361747 ch04 html讨论 python 字典
  • 如何在 Cypress 中存储图像的 src 并将其与另一个图像进行比较?

    测试目标是确认如果用户上传新图像 则上传图像的 src 属性会发生更改 这意味着图像已更改 我尝试使用几种方法 概述如下 第一种方法 cy get img then img gt store the src const source img
  • Chrome 会混淆使用 SVG 格式的网络字体设计的文本(有时)

    Demo http jsbin com onixik 2 http jsbin com onixik 2 内容如下 如果您在 Windows 上的 Chrome 中检查该演示 它可能看起来不错 也可能不太好 我所说的 OK 是指它并不引人注
  • 更改 tkinter 中的输入框背景颜色

    所以我一直在研究这个程序 但我发现很难找出问题所在 我对 tkinter 还很陌生 所以这可能很小 我试图让程序在按下复选按钮时更改输入框的背景颜色 或者更好的是 如果我可以动态地改变它 那就更好了 这是我目前的代码 TodayReadin
  • 在Java中无损JPEG旋转(90/180/270度)?

    是否有一个 Java 库可以以 90 度的增量旋转 JPEG 文件 而不会导致图像质量下降 我找到了这个 http mediachest sourceforge net mediautil http mediachest sourcefor
  • 使用 Azure 管道在特定的自托管服务器上运行

    在 Azure git 中 我正在运行一些自托管代理 它们位于名为 默认 的池中 在 Azure 管道 yml 文件 中 我可以告诉作业它必须在特定代理中运行 如下所示 pool name Default demands Agent Nam
  • 假装电报机器人正在打字?

    如何让机器人假装正在输入消息 当机器人假装打字时 聊天中会出现以下文本 我用的是蟒蛇aiogram https github com aiogram aiogram框架 但对原生 Telegram API 的建议也会有所帮助 我认真建议使用
  • MySQL CSV 导入 - 如果时间戳有毫秒,则日期输入为 0000-00-00 00:00:00?

    我目前有大量 CSV 需要导入到 MySQL 数据库中 这些文件包含每条记录的时间戳 其格式如下 例如 2011 10 13 09 36 02 297000000 我知道 MySQL 错误 8523 它表明不支持在日期时间字段中存储毫秒 尽
  • 如何强制 GCC 假定浮点表达式为非负?

    在某些情况下 您知道某个浮点表达式始终为非负数 例如 当计算向量的长度时 sqrt a 0 a 0 a N 1 a N 1 NB I am意识到std hypot 这与问题无关 并且平方根下的表达式显然是非负的 然而 海湾合作委员会outp
  • NHibernate WinForms 应用程序使用哪个缓存

    我有一个带有数据库后端 oracle 的 C WinForms 应用程序 并使用 NHibernate 进行 O R 映射 我想尽可能减少与数据库的通信 因为这里的网络非常慢 所以我阅读了有关二级缓存的内容 我发现这个很好的介绍 http
  • ELB 和 ECS 集群前面的 Amazon API Gateway

    我尝试将 Amazon API Gateway 放在应用程序负载均衡器前面 该负载均衡器可以平衡到我的 ECS 集群的流量 我的所有微服务都部署在该集群上 使用 API 网关的动机是通过 lambda 函数使用自定义授权方 系统图 用亚马逊
  • Asp.Net Core 1.1 在密钥环中找不到密钥

    VS 2017 中的默认项目 https i stack imgur com Y12YS jpg我在 vs 2017 社区中创建了一个新的 Asp net Core Web 应用程序并将其发布到 FTP 托管上 但是当我提交表单 登录或用户
  • 幂律与其他分布的比较

    我正在使用 Jeff Alstott 的 Python powerlaw 包来尝试使我的数据符合幂律 Jeff 的软件包基于 Clauset 等人讨论幂律的论文 首先 我的数据的一些详细信息 它是离散的 字数数据 它严重向左倾斜 高偏度 I
  • 如何在不阅读的情况下获取文件中的行数[重复]

    这个问题在这里已经有答案了 可能的重复 如何快速统计行数 https stackoverflow com questions 6101367 how to count lines fast 我有一些文件逐行包含数据 我想获取文件中的行数以向
  • 通过比较 2 个列表/行的相似度进行图像旋转匹配 OpenCV Python

    我拿一个模板 并从中抽取 8 个点 现在为 36 个 每个小点都是一个掩模 我从那个小点区域中取平均值 然后将它们添加到列表中 它最终看起来像这样 203 176 160 174 185 185 152 136 131 131 131 13
  • 在 Groovy 中计算赋值表达式

    我有这样的表达 def expr anything something 就我而言 上面的字符串来自网络服务 但它可能来自任何地方 我想对此进行评估 以便最终得到具有 某物 值的变量 anything 这样 assert anything s
  • 为什么克隆的存储库比获取的存储库大 10 倍?

    我们有一个远程仓库 其大小已经爆炸 1 4G 到 14G 我们正在尝试找出此存储库大小增加的原因并解决问题 在这个过程中我们注意到 git clone 和 git fetch 之间的显着差异 如果我们克隆仓库 克隆的仓库也是 14G git
  • 发布 Google Apps 脚本库

    我对如何发布新库有点困惑 我为 Google Apps 脚本创建了一个我认为非常酷且有用的库 google api client https docs google com macros library versions d M5CBUAH
  • 在缩放模式 Picturebox 中平移矩形位置会导致负 Y 坐标

    我正在使用以下类参考 在缩放模式 Picturebox 中平移矩形位置 https stackoverflow com questions 53800328 translate rectangle position in zoom mode