C#基于SkiaSharp实现印章管理(9)

news2024/9/28 7:13:17

  将印章设计模块设计的印章保存为图片并集中存放在指定文件夹内。新建印章应用项目,主要实现对图片及PDF文件加盖印章功能。本文实现给图片加盖印章功能。
  给图片加盖印章的逻辑比较简单,就是将印章图片绘制到图片指定位置,使用SKControl控件绘制图片(之前使用Panel控件和GDI+绘制图片,Panel自带滚动条及相关设置,暂时没有看到SKControl控件的滚动条设置方式)。
  主要实现的功能包括:
  1)枚举指定文件夹内的印章图片,选择印章后在线预览印章图片;
  2)打开本地图片并在SKControl控件绘制图片,支持图片缩放;
  3)点击加盖印章按钮,支持鼠标在SKControl控件中移动时实时显示印章,点击鼠标左键时,在点击位置加盖印章(将印章图片绘制到图片中鼠标点击位置)。

  关键代码及运行效果如下。程序运行时遇到的问题是印章图片和待盖章图片的分辨率不一样时,将印章图片绘制到待盖章图片中后,会出现印章变大或变小的情况,后续考虑如何处理这种情况。

private void pnlImage_PaintSurface(object sender, SkiaSharp.Views.Desktop.SKPaintSurfaceEventArgs e)
{
    SKCanvas canvas = e.Surface.Canvas;
    canvas.Clear();

    if (m_srcImage != null)
    {
        canvas.DrawBitmap(m_srcImage, new SKRect(m_startX, m_startY, m_startX + m_srcImage.Width * m_scale, m_startY + m_srcImage.Height * m_scale));

        if (m_sealImage != null && !m_sealFixed)
        {
            canvas.DrawBitmap(m_sealImage, new SKRect(m_sealStartX, m_sealStartY, m_sealStartX + m_sealImage.Width * m_scale, m_sealStartY + m_sealImage.Height * m_scale));
        }
    }
}

private void pnlImage_MouseMove(object sender, MouseEventArgs e)
{
    if (!m_sealFixed)
    {
        m_sealStartX = e.X;
        m_sealStartY = e.Y;

        pnlImage.Invalidate();
    }
}

private void pnlImage_MouseClick(object sender, MouseEventArgs e)
{
    if (m_srcImage != null && !m_sealFixed)
    {
        if (MessageBox.Show("确定在此处盖章?") == DialogResult.OK)
        {
            m_sealFixed = true;

            using (SKCanvas canvas = new SKCanvas(m_srcImage))
            {
                canvas.DrawBitmap(m_sealImage, new SKPoint((e.X - m_startX) / m_scale, (e.Y - m_startY) / m_scale));
            }

            m_sealImage = null;

            pnlImage.Invalidate();
        }
    }
}

在这里插入图片描述
在这里插入图片描述

参考文献:
[1]https://learn.microsoft.com/zh-cn/dotnet/api/skiasharp?view=skiasharp-2.88
[2]https://www.cnblogs.com/bhnian/p/16343557.html
[3]https://www.jb51.net/html5/676291.html
[4]https://blog.csdn.net/L_Shaker/article/details/127313457

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2172788.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何选择数据库架构

选择合适的数据库架构是一个复杂的过程,它取决于多种因素,包括应用程序的需求、数据量的大小、并发访问量、数据一致性要求、预算以及技术团队的熟悉程度等。以下是一些关键的步骤和考虑因素,帮助你选择合适的数据库架构: 1. 分析…

JITWatch安装使用方法

JITWatch 版本1.4.2 JDK 版本 11以上 1.下载JITWatch: https://github.com/AdoptOpenJDK/jitwatch/releases/download/1.4.2/jitwatch-ui-1.4.2-shaded-win.jar 2.启动 bat脚本执行:通过启动jar包方式启动JITWatch echo off start cmd /c "ti…

人工智能 实验1 Python语法

我发现了有些人喜欢静静看博客不聊天呐, 但是ta会点赞。 这样的人呢帅气低调有内涵, 美丽大方很优雅。 说的就是你, 不用再怀疑哦 实验1 Python语言基础一 【实验目的】掌握Python及其集成开发环境的下载安装及其简单应用 【实验内容…

结合了LLM(大语言模型)的编辑器,不仅能理解人类语言,还能与用户互动,仿佛有了自己的思想。...

从前有一个神奇的编辑器王国,那里住着各种编辑器:开源的、AI代码编辑器、视频编辑器,还有专门处理邮件和音频的编辑器。一天,国王Markdown决定举办一场盛会,邀请所有编辑器展示各自的才华。 开源编辑器们自豪地展示了他…

解决hbase和hadoop的log4j依赖冲突的警告

一、运行hbase的发现依赖冲突的警告 这警告不影响使用 二、重命名log4j文件 进入HBase的lib包下,将HBase的log4j文件重命名,改成备份,这样再次运行hbase的时候,就没有依赖冲突了。 三、冲突成功解决

数据分析工具julius ai如何使用

什么是julius ai Julius AI 是一款强大的ai数据分析工具。用户可以使用excel、数据库、文本文件等多种格式的数据,Julius AI 会自动分析这些数据并提供详细的解释和可视化图表。官网显示它目前已经有三十万用户。它也支持手机版。 虽然openai也支持生成图表&#xf…

研究生如何利用ChatGPT帮助开展日常科研工作?

小白可做!全自动AI影视解说一键成片剪辑工具https://docs.qq.com/doc/DYnl6d0FLdHp0V2ll 作为当代研究生,科研工作三部曲----读文献、开组会、数据分析。无论哪一个,都令研究生们倍感头疼,简直就是梦魇。每当看到导师发来的消息&a…

Redis的主要特点及运用场景

Redis的主要特点及运用场景 Redis(Remote Dictionary Server)是一个开源的高性能键值对(key-value)数据库。它支持多种类型的数据结构,如字符串(strings)、散列(hashes&…

CS61b学习 part 2

cscircles.cemc.uwaterloo.ca/java_visualize/#modedisplay public class ClassNameHere {public static void main(String[] args) {Walrus a new Walrus(1000, 8.3);Walrus b;b a;/*由于缺少函数,导致两个对象指向的是同一份*/b.weight 5;System.out.println(…

通俗易懂的Latex使用步骤

目录 Latex的安装和基本框架 TeX Live和TeXstudio的安装 Latex基本框架 标题 目录 列表 字体设置 图片 单张图片 多张图片(以两张图片为例): 多张图片(以三张图片为例): 公式 公式复制神器: …

全网最适合入门的面向对象编程教程:53 Python字符串与序列化-字符串与字符编码

全网最适合入门的面向对象编程教程:53 Python 字符串与序列化-字符串与字符编码 摘要: 在 Python 中,字符串是文本的表示,默认使用 Unicode 编码,这允许你处理各种字符集,字符编码是将字符转换为字节的规则…

第五部分:3---信号的介绍、产生、保存、处理

目录 信号的概念: 异步的概念: 信号的3种处理方式: 修改2号信号为自定义信号处理: ​编辑 信号捕捉后恢复和信号的忽略: 信号的分类与编号: 特殊的信号: 进程信号表的继承:…

标准 I/O

标准 I/O 引言 I/O 是一切实现的基础,其分为标准 I/O 和文件 I/O。 文件 I/O 依赖操作系统,因系统的实现方式而定,对于程序员来说会造成很大困扰。如打开文件,Linux 系统调用为 open() 函数,而 Windows 的系统调用为…

在新ARM板上移植U-Boot和Linux指南

序言 从支持一个定制板子在U-Boot和Linux中的过程中得到经验以一个带有知名SoC(i.MX6)且IP已经得到支持的板子为例,这次讨论几乎不涉及编码技能,更多地聚焦在U-Boot部分 一般原则 如果您有您的BSP(板级支持包&#…

推荐、nlp、算法题等相关复习(0922-0929)

1. 算法题:路径总和三 求一棵树中所有路径和为targetsum的值,其实有点像和为k的数组,用前缀和来做 先求出前缀和数组,再类似两数之和问题,每次插入一个数,如果target-当前数在哈希表里存在,更…

Vscode: reason: oom, code: -536870904

最近使用github+插件github copilot开发时遇到这个问题, 出现原因:在chat窗口输入了过大的内容。 现象是:每次打开vscode后正常,且打开其他文件夹,再打开chat窗口运行正常。但当再次打开原来的文件夹并打开chat窗口时,则出现此崩溃问题。 尝试以下办法: 1、将D盘虚拟…

Android——添加联系人

概述 第一步 往手机联系人应用中的raw_contacts表添加一条记录 raw_contacts表 ContentValues values new ContentValues();// 往 raw_contacts 添加联系人记录,并获取添加后的联系人编号Uri uri resolver.insert(ContactsContract.RawContacts.CONTENT_URI, …

AI绘画相似风格的作品

目标:根据一张图风格,画出更好的图片 步骤一 等待几分钟,就出来了,点击获取第一个关键词并复制 然后会得到这个四张图片 选中其中的一张,比如第一张 很快就拿到了结果

图解FTP服务器配置:实体用户方式访问案例

任务要求: 某企业搭建一个内部ftp服务器,要求实现如下功能: 用户登录时显示一些欢迎信息;系统账户root、bin不能登录主机;实体用户ligang、liuqiang能够登录ftp服务器;实体用户ligang、liuqiang不能登录本…

数据治理005-血缘关系

数据血缘是元数据产品的核心能力,但数据血缘是典型的看起来很美好但用起来门槛很高的技术,只要你采买过元数据产品就知道了。这篇文章对数据血缘的特征、价值、用途和方法做了系统阐述: 1、特征:归属性、多源性、可追溯及层次性 2…