代码链接

1. picturebox上的坐标与原图中坐标的转换

(1) 由于图片的长宽比例和picturebox的长宽比例不同,所以图片不想拉伸的话,左右或者上下会有留白。将picturebox的sizemode设为zoom,计算留白距离。

默认情况下,在 Normal 模式中,Image 置于 PictureBox 的左上角,凡是因过大而不适合 PictureBox 的任何图像部分都将被剪裁掉。

PictureBoxSizeMode.StretchImage:使用 StretchImage 值会使图像拉伸或收缩,以便适合 PictureBox。

PictureBoxSizeMode.AutoSize:使用 AutoSize 值会使控件调整大小,以便总是适合图像的大小。

PictureBoxSizeMode.CenterImage:使用 CenterImage 值会使图像居于工作区的中心。

PictureBoxSizeMode.Zoom:使用 Zoom 的值可以使图像被拉伸或收缩以适应 PictureBox;但是仍然保持原始纵横比。

(2)picturebox的坐标都要先减去留白距离,根据比例缩放后再加上显示区域的偏移量

 private OpenCvSharp.Point GetImagePoint(System.Drawing.Point p)
{
OpenCvSharp.Point imagePoint;
int width = showImage.Width;
int height = showImage.Height;
int w = Width; int h = Height;
double ratio;
if (w_empty>0)
{
ratio = h * 1.0 / height; if (p.X < w_empty || p.X > w - w_empty)
imagePoint.X = -1;
else
imagePoint.X = LUCol + (int)((p.X - w_empty) * 1.0 / ratio);
imagePoint.Y = LURow + (int)(p.Y * 1.0 / ratio);
}
else
{
ratio = w * 1.0 / width; imagePoint.X = LUCol + (int)(p.X * 1.0 / ratio);
if (p.Y < h_empty || p.Y > h - h_empty)
imagePoint.Y = -1;
else
imagePoint.Y = LURow + (int)((p.Y - h_empty) * 1.0 / ratio);
}
return imagePoint;
}

2. 滚动放大

滚动放大时,当前坐标为放大中心。

滚动放大后,显示部分占原图的比例会减小,显示部分左上角点在原图的坐标也会移动。

从原图上裁出显示部分    new Rect(LUCol, LURow, RealWidth, RealHeight)

public void pictureBox_MouseWheel(object sender, MouseEventArgs e)
{
if (Image == null) return;
if (e.Delta > 0)
{
RealWidth /= 2;
RealHeight /= 2;
LUCol = CurrentPoint.X - (int)RealWidth / 2;
LURow = CurrentPoint.Y - (int)RealHeight / 2;
}
else
{
RealWidth *= 2;
RealHeight *= 2;
LUCol = CurrentPoint.X - (int)RealWidth / 2;
LURow = CurrentPoint.Y - (int)RealHeight / 2; } judgeBounds();
showImage = new Mat(srcImage, new Rect(LUCol, LURow, RealWidth, RealHeight)); }

3. 拖动图片

public void pictureBox_MouseMove(object sender, MouseEventArgs e)
{
... if (e.Button == MouseButtons.Left)
{
EndPoint = GetImagePoint(e.Location);
int offsetX = EndPoint.X - CurrentPoint.X;
int offsetY = EndPoint.Y - CurrentPoint.Y;
LURow -= offsetY;
LUCol -= offsetX;
judgeBounds();
showImage = new Mat(srcImage, new Rect(LUCol, LURow, RealWidth, RealHeight)); }
...
}

4. 图片放大后呈现像素块

重写paint,将插值方法改为最近邻插值

        public void pictureBox_Paint(object sender, PaintEventArgs e)
{
if (Image == null)
return;
var state = e.Graphics.Save();
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
e.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
e.Graphics.Clear(BackColor);
if(h_empty!=0)
e.Graphics.DrawImage(Image, 0, h_empty, Width, Height-2*h_empty);
else
e.Graphics.DrawImage(Image, w_empty, 0, Width - 2*w_empty, Height);
e.Graphics.Restore(state);
}

C#笔记 picturebox功能实现(滚动放大,拖动)的更多相关文章

  1. WM_SYSCOMMAND包括很多功能,比如:拖动左边框、拖动标题栏、滚动条滚动、点击最小化、双击标题栏——Delphi 通过事件代替了大部分常用的消息,所以Delphi 简单、易用、高效

    procedure TForm1.WMSysCommand(var Message: TWMSysCommand); var str: string; begin case Message.CmdTy ...

  2. Unity 3D还原Scene场景、市面多数游戏视角高度自定义、第三人称视角分离功能:平移、拖动、看向中心等

    Unity视角的高度自定义 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...

  3. jQuery点击图片放大拖动查看效果

    效果如图: 放大前: 放大后(可拖动图片浏览): 源码如下: <html xmlns="http://www.w3.org/1999/xhtml"> <head& ...

  4. IOS开发学习笔记036-UIScrollView-循环自动滚动

    实现scrollView的自动循环滚动,需要实现几个方法. 其中scrollView中始终保存三张图片,其他的图片在滚动到时再进行加载. 循环的实现主要是在setUpdate 中,如果索引为0是第一个 ...

  5. 鼠标滚轮滚动慢/拖动Office出现滞后问题处理

    一.说明 我对外设一直不是很了解,买的鼠标今天到了,使用时遇到了两个问题在这里记一下. 二.滚轮滚动慢处理 问题描述:在网页中滚动滚轮每次只能上下移动一点点,感觉很难受. 问题原因:此问题是滚轮滚动一 ...

  6. ThreeJs 导入外部三维模型,并实现鼠标滚动放大缩小旋转效果

    let i = ; function init() { // create a scene, that will hold all our elements such as objects, came ...

  7. Verilog学习笔记简单功能实现(八)...............同步FIFO

    Part 1,功能定义: 用16*8 RAM实现一个同步先进先出(FIFO)队列设计.由写使能端控制该数据流的写入FIFO,并由读使能控制FIFO中数据的读出.写入和读出的操作(高电平有效)由时钟的上 ...

  8. Verilog学习笔记简单功能实现(五)...............序列检测设计

    这里采用夏宇闻教授第十五章的序列检测为例来学习; 从以上的状态转换图可以写出状态机的程序: module seqdet(x,out,clk,rst); input x,clk,rst; output ...

  9. WPF之拖动项滚动条自滚动(当拖动项到达高度的边界时候滚动条自己可以上下滚动)

    参考 http://www.cnblogs.com/ListenFly/p/3281997.html Point svPoint = e.GetPosition(sv); if (sv.ActualH ...

  10. JavaScript学习笔记——简单无缝循环滚动展示图片的实现

    今天做了一个简单的无缝循环滚动的实例,这种实例在网页中其实还挺常见的,下面分享一下我的学习收获. 首先,无缝滚动的第一个重点就是——动.关于怎么让页面的元素节点动起来,这就得学明白关于JavaScri ...

随机推荐

  1. redis 简单整理——持久化之RDB[十九]

    前言 简单介绍一下redis的持久化.先来整理一下RDB. 正文 redis 支持RDB 和 AOF两种持久化机制,他们能达到的效果不一致. 那么先来看一下RDB吧. RDB 是把当前进程数据生成快照 ...

  2. 在Windows电脑上快速运行AI大语言模型-Llama3

    概述 近期 Meta 发布了最新的 Llama3 模型,并开源了开源代码.Meta Llama 3 现已推出 8B 和 70B 预训练和指令调整版本,可支持广泛的应用程序. 并且 Llama 3 在语 ...

  3. sql多表分页查询【oracle】

    sql多表查询[oracle] 做个记录,好歹是写出来了,使用左连接的方法,进行四表查询,且使用rownum进行分页 把涉及内容的全部替换了,不过应该都看得懂,就不说了 select * from ( ...

  4. 【走进RDS】之SQL Server性能诊断案例分析

    简介: 数据库性能诊断不仅对其数据库技能要求较高,而且需要大量的前期准备工作,如收集各种性能基线.性能指标和慢SQL日志等,尤其是面对多数据库性能调优时,往往事倍功半. 客户的困扰 前几天某程序员小王 ...

  5. 内含干货PPT下载|一站式数据管理DMS及最新解决方案发布

    ​简介: 今天主要给大家介绍一站式数据管理平台DMS以及解决方案的发布.议题包含企业数据管理当前的一些痛,DMS一站式数据管理平台以及其核心技术,实时数仓解决方案以及相应的应用实践. "数聚 ...

  6. [GPT] golang代码组织的核心思想

    1/golang代码组织的核心思想 Go语言(Golang)在代码组织上的核心思想是模块化和封装,主要体现在以下几个方面: 1.包(Packages): Go语言通过包(Packages)来组织代码, ...

  7. dotnet 读 WPF 源代码笔记 了解 WPF 已知问题 用户设备上不存在 Arial 字体将导致应用闪退

    本文来告诉大家 WPF 已知问题,在用户的设备上,如果不存在 Arial 字体,同时安装了一些诡异的字体,那么也许就会让应用在使用到诡异的字体的时候,软件闪退 在 WPF 的 FontFamily.c ...

  8. Java设计模式-策略模式-基于Spring实现

    1.策略模式 1.1.概述 策略模式是一种行为设计模式,它允许在运行时选择算法的行为.它将算法封装在独立的策略类中,使得它们可以相互替换,而不影响客户端代码.这种模式通过将算法的选择从客户端代码中分离 ...

  9. 记录一次fs通话无声的问题

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. fs的实际应用中,由于网络.配置等问题,经常会产生通话无声的问题. 环境 CentOS 7.9 freeswitch 1.10.7 ...

  10. SAP集成技术(五)集成风格

    上一节介绍了各种集成架构,这一节将介绍各种集成风格(Style).我们在日常工作中使用这些集成风格来分类不同类型的集成场景.本文将遵循SAP的集成解决方案咨询方法(ISA - M)使用的方法,将集成风 ...