一款简单的缩放拖拽图片控件

简介: 本文介绍一个针对 .NET 桌面应用程序的独立图片缩放拖拽显示控件 [SQPhoto](https://www.nuget.org/packages/SQPhoto/)。

SQPhoto 是一个 Windows 桌面应用的组件,支持 .NET6 和 .NET Framework 4.6 + 。基于 PictureBox 的图片展示工具,增加了拖动和缩放功能,便于在某些场景下的图片展示,比如我前面开发的 Snipping_OCR 工具就使用了这个组件。

Snipping_OCR

该用户组件采用 PanelPictureBox 组合的方式,控制 PictureBoxPanel 容器中显示的位置和大小来实现拖拽和放大缩小的功能。

/// <summary>
/// 计算鼠标移动位置是否还在容器内
/// </summary>
/// <returns></returns>
private bool IsMouseInPanel()
{
    if (PanBox.Left < PointToClient(Cursor.Position).X
    && PointToClient(Cursor.Position).X < PanBox.Left + PanBox.Width
    && PanBox.Top < PointToClient(Cursor.Position).Y
    && PointToClient(Cursor.Position).Y < PanBox.Top + PanBox.Height)
    {
        return true;
    }
    else
    {
        return false;
    }
}

/// <summary>
/// 鼠标移动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void PicBox_MouseMove(object sender, MouseEventArgs e)
{
    //开启移动 左键按下 并且移动位置在框内
    if (_CanMove && isSelected && IsMouseInPanel())
    {
        PicBox.Location = new Point(PicBox.Left + (Cursor.Position.X - mouseDownPoint.X), PicBox.Top + (Cursor.Position.Y - mouseDownPoint.Y));
        mouseDownPoint = Cursor.Position;
    }
}

缩放的实现:

/// <summary>
/// 控制图片缩放
/// </summary>
/// <param name="change">变化情况,大于 0 放大,小于 0 缩小</param>
public void PicZoomSize(int change)
{
    var t = PicBox.Size;
    t.Width += change;
    t.Height += change;

    //控制最小缩放
    if (t.Width < _ZoomMin) return;
    PicBox.Size = t;

    //图片按中心比例放大缩小
    if (!_ZoomCenter) return;
    PicBox.Location = new Point((this.Width - PicBox.Width) / 2, (this.Height - PicBox.Height) / 2);
}

demo

以上组件和 Demo 仓库地址:https://github.com/sangyuxiaowu/SQPhoto

相关文章
|
JSON 前端开发 JavaScript
富文本编辑器Ueditor实战(三)-springboot集成
通过本文,您可了解springboot如何集成ueditor,如何自定义扩展后端的文件上传功能。
1246 0
富文本编辑器Ueditor实战(三)-springboot集成
|
11月前
|
XML 存储 对象存储
如何通过CDN进行智能图片处理?
图片加载慢导致用户流失?阿里云CDN智能图片处理技术,助力提升网页性能。支持WebP自适应、格式转换、质量压缩等功能,有效降低图片体积,加速加载速度。开启后可显著减少页面延迟,避免转化率下降,提升用户体验与业务收益。
如何通过CDN进行智能图片处理?
|
缓存 JSON API
VIN车辆识别码查询车五项 API 实践指南:让每一俩车有迹可循(Python代码示例)
VIN(车辆识别代码)是全球唯一的17位汽车标识码,可快速获取车架号、发动机号、品牌型号等核心信息。在二手车交易、保险理赔、维修保养等场景中,准确解析VIN有助于提升效率与风控能力。本文介绍VIN码结构、适用场景,并提供Python调用示例及优化建议,助力企业实现车辆信息自动化核验。
1755 1
|
JSON Shell Linux
docker-registry 私有仓库镜像 之 查看与删除
docker-registry 私有仓库镜像 之 查看与删除
4131 0
|
7月前
|
存储 监控 固态存储
阿里云服务器配置选择参考:cpu与内存、带宽和云盘种类及容量选择注意事项参考
阿里云服务器配置选择参考:选择合适的阿里云服务器配置与云盘容量,用户需先明确业务需求,包括网站类型、访问量、应用类型、性能需求及数据安全性等。根据需求选CPU核心数、内存及带宽,如高并发场景需多核CPU与大内存。云盘容量上,系统盘建议20G-40G,数据盘依数据量选50G-100G或更大,并区分系统盘与数据盘用途。
|
4月前
|
JSON 人工智能 监控
给 Agent 接入 28+ 外部数据源踩过的三个工程坑:AgentKey 架构实战
AgentKey 是2026年专为AI智能体打造的「数字钥匙串」,提供统一Master Key,一站式接入28+平台(X/Reddit/B站/小红书/链上数据等),规避账号风控与API管理复杂度,让Agent真正“看得见、摸得着”真实世界"
|
JSON API 数据安全/隐私保护
车辆五项信息查询 API 的实践指南:通过Python调用赋能车辆信息标准化
本API通过车牌号快速获取车辆五项核心信息,包括品牌、登记日期、车架号等,助力二手车评估、维修、保险等场景实现数字化转型。数据源自权威公安交管库,日更同步,毫秒级响应,满足高并发需求,符合隐私保护规范,是推动汽车后市场智能化的重要工具。
937 0
|
SQL API
金融行业 · 大模型挑战赛 |用大模型理解金融市场
2024金融行业大模型挑战赛即将开启,旨在推动大型语言模型在金融领域的应用。比赛提供金融多轮问答数据集,参赛者需使用GLM-4模型API,通过SQL、API等技术解决金融问题,涵盖数据查询、统计分析及复杂问题处理。赛事分初赛、复赛和决赛,总奖金20万元。报名时间为2024年12月2日至2025年2月6日。
1569 16
金融行业 · 大模型挑战赛 |用大模型理解金融市场
|
安全 关系型数据库 MySQL
mysql 安装插件 validate_password
mysql 安装插件 validate_password
1340 0
|
Java Apache Maven
将word文档转换成pdf文件方法
在Java中,将Word文档转换为PDF文件可采用多种方法:1) 使用Apache POI和iText库,适合处理基本转换需求;2) Aspose.Words for Java,提供更高级的功能和性能;3) 利用LibreOffice命令行工具,适用于需要开源解决方案的场景。每种方法都有其适用范围,可根据具体需求选择。
2311 2

热门文章

最新文章