C#笔记 picturebox功能实现(滚动放大,拖动)
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功能实现(滚动放大,拖动)的更多相关文章
- WM_SYSCOMMAND包括很多功能,比如:拖动左边框、拖动标题栏、滚动条滚动、点击最小化、双击标题栏——Delphi 通过事件代替了大部分常用的消息,所以Delphi 简单、易用、高效
procedure TForm1.WMSysCommand(var Message: TWMSysCommand); var str: string; begin case Message.CmdTy ...
- Unity 3D还原Scene场景、市面多数游戏视角高度自定义、第三人称视角分离功能:平移、拖动、看向中心等
Unity视角的高度自定义 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...
- jQuery点击图片放大拖动查看效果
效果如图: 放大前: 放大后(可拖动图片浏览): 源码如下: <html xmlns="http://www.w3.org/1999/xhtml"> <head& ...
- IOS开发学习笔记036-UIScrollView-循环自动滚动
实现scrollView的自动循环滚动,需要实现几个方法. 其中scrollView中始终保存三张图片,其他的图片在滚动到时再进行加载. 循环的实现主要是在setUpdate 中,如果索引为0是第一个 ...
- 鼠标滚轮滚动慢/拖动Office出现滞后问题处理
一.说明 我对外设一直不是很了解,买的鼠标今天到了,使用时遇到了两个问题在这里记一下. 二.滚轮滚动慢处理 问题描述:在网页中滚动滚轮每次只能上下移动一点点,感觉很难受. 问题原因:此问题是滚轮滚动一 ...
- ThreeJs 导入外部三维模型,并实现鼠标滚动放大缩小旋转效果
let i = ; function init() { // create a scene, that will hold all our elements such as objects, came ...
- Verilog学习笔记简单功能实现(八)...............同步FIFO
Part 1,功能定义: 用16*8 RAM实现一个同步先进先出(FIFO)队列设计.由写使能端控制该数据流的写入FIFO,并由读使能控制FIFO中数据的读出.写入和读出的操作(高电平有效)由时钟的上 ...
- Verilog学习笔记简单功能实现(五)...............序列检测设计
这里采用夏宇闻教授第十五章的序列检测为例来学习; 从以上的状态转换图可以写出状态机的程序: module seqdet(x,out,clk,rst); input x,clk,rst; output ...
- WPF之拖动项滚动条自滚动(当拖动项到达高度的边界时候滚动条自己可以上下滚动)
参考 http://www.cnblogs.com/ListenFly/p/3281997.html Point svPoint = e.GetPosition(sv); if (sv.ActualH ...
- JavaScript学习笔记——简单无缝循环滚动展示图片的实现
今天做了一个简单的无缝循环滚动的实例,这种实例在网页中其实还挺常见的,下面分享一下我的学习收获. 首先,无缝滚动的第一个重点就是——动.关于怎么让页面的元素节点动起来,这就得学明白关于JavaScri ...
随机推荐
- 15M安装包就能玩《原神》,带你了解云游戏背后的技术秘密
简介:对于大多数玩家来说,云游戏已经不是一个陌生的概念,它经常和秒玩.不吃设备.大屏临场感.上手门槛低.真香等字眼一起出现在评论留言区.的确,对于既想尝试高品质游戏大作又不想一直卷装备的玩家来说,云游 ...
- 阿里云数据库开源重磅发布:PolarDB HTAP的功能特性和关键技术
简介:在3月2日的阿里云开源 PolarDB 企业级架构发布会上,阿里云 PolarDB 内核技术专家严华带来了主题为<PolarDB HTAP详解>的精彩演讲.在PolarDB存储计算分 ...
- WPF 关于将 ManipulationDeltaEventArgs 的 Manipulators 属性返回值修改为 ReadOnlyCollection 类型的提议
这是一个 WPF 框架的 API 变更提议,记录一下博客 讨论的地方是: How about change the type of ManipulationDeltaEventArgs.Manipul ...
- nginx部署使用history模式的vue项目详细配置【可多级目录】
介绍 本文是篇详细的介绍vue项目在history模式下发布时build,项目如何配置,nginx如何配置,才能正常的使用历史模式.或者在二级目录下,多级路径下也能正常使用历史模式. 本文的例子中假设 ...
- OSI模型之数据链路层
一.简介 数据链路层在物理层提供服务的基础上向网络层提供服务,其最基本的服务是将源自网络层的数据可靠地传输到相邻节点的目标机网络层.其主要作用是加强物理层传输原始比特流的功能,将物理层提供的可能出错的 ...
- Oracle和达梦:获取表是否被锁定
1.获取表是否被锁定 select "V$SESSIONS".SESS_ID,"V$SESSIONS".SQL_TEXT,"V$SESSIONS&qu ...
- 手把手搭建WebSocket多人在线聊天室(SpringBoot+WebSocket)
前言 本文中搭建了一个简易的多人聊天室,使用了WebSocket的基础特性. 源代码来自老外的一篇好文: https://www.callicoder.com/spring-boot-websocke ...
- FFmpeg开发笔记(十九)FFmpeg开启两个线程分别解码音视频
同步播放音视频的时候,<FFmpeg开发实战:从零基础到短视频上线>一书第10章的示例程序playsync.c采取一边遍历一边播放的方式,在源文件的音频流和视频流交错读取的情况下,该方式 ...
- 06. rails gem 安装mysql
修改Gamefile Gamefile 里添加 gem 'mysql2' 执行命令行 bundle 可以看到下图片上已经安装好依赖了 修改配置文件 修改config/database.yml文件 # ...
- linux定时任务crontab 周期执行任务
目录 1. crontab主要作用 2. 如何添加crontab 定时任务 3. 计划任务,crontab命令选项: 4. cron文件语法: 5. 查看计划任务 1 创建脚本文件test.py,在文 ...